- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想创建一个简单的类,它只将数据存储/保存为类属性,而不将实例创建为对象。
简单到可以从我的代码中的任何地方访问:
class DATA:
foo = {}
bar = {}
现在我想更进一步,始终将对 foo
和 bar
的更改保存在一个文件中,例如搁置,仍然没有创建对象/实例。
我最初的想法是这样的:
class DATA2:
foo = {}
bar = {}
_shelve = False
def __setattr__(self, name, value):
if self._shelve is False:
self.__dict__['_shelve'] = shelve.open('datastorage.shelve')
self.__dict__['_shelve'][name] = value
self.__dict__[name] = value
但是 __setattr__
不能像这样使用 self
参数。而且类实例上似乎没有 __setattr__
方法。
我的第二种方法是使用元类,它在后台创建一个类实例,将其隐藏在代码之外:
class _DATA_MetaClass(type):
foo = {}
bar = {}
_shelve = False
def __setattr__(self, name, value):
if self._shelve is False:
self.__dict__['_shelve'] = shelve.open('datastorage.shelve')
self.__dict__['_shelve'][name] = value
self.__dict__[name] = value
class DATA(object):
__metaclass__ = _DATA_MetaClass
DATA.x = 'val'
这不起作用,它产生:
TypeError: 'dictproxy' 对象不支持项目分配
这是为什么?
最佳答案
您可以使用父类(super class)(即type
)的__setattr__
方法来设置自定义属性:
class _DATA_MetaClass(type):
foo = {}
bar = {}
_shelve = False
def __setattr__(self, name, value):
if self._shelve is False:
super(_DATA_MetaClass, self).__setattr__('_shelve', shelve.open('datastorage.shelve'))
self._shelve[name] = value
super(_DATA_MetaClass, self).__setattr__(name, value)
关于Python:__setattr__ 作为类方法//self.__dict__ 对元类的赋值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68858059/
type.__setattr__ 用于类,基本上是元类的实例。另一方面,object.__setattr__ 用于类的实例。这是完全明白的。 我看不出这两种方法有什么显着差异,至少在 Python 级
我将命名元组用于不可变数据结构,直到遇到数据类,我在我的用例中更喜欢它(与问题无关)。 现在我了解到它们不是一成不变的!至少严格来说不是。setattr(frozen_dc_obj, "prop",
我试图了解 __setattr__ 如何与类属性一起工作。当我试图覆盖 __setattr__ 以防止在简单类中写入属性时,这个问题就出现了。 我的第一次尝试使用了实例级属性,如下所示: class
我定义了以下类(其中很大一部分被缩短),但我的主要问题是,一旦用其初始化变量定义了此类的对象,我想确保这些变量在类外部是不可更改的...如果进行这样的尝试,我将需要引发 AssertionError
只有当在对象的属性中找不到该属性时,我才想使用 __setattr__,例如 __getattr__。 我真的必须使用try- except吗? def __setattr__(self, name,
如果在类中重写魔术方法 __getattr__,则只有在找不到属性时才调用被重写的方法,否则会出现默认行为。 但是__setattr__好像不是这样,它影响所有的属性。 我正在寻找的是当属性存在时表现
如何在旧式类上执行 __setattr__ 的等效操作? 最佳答案 如果你想做的是为旧样式类的实例设置属性,你可以使用 setattr内置函数,它也应该适用于旧式类。示例 - >>> class Fo
如下面的代码所示,为什么我不能使用 __setattr__ 在作为重载方法的类的一部分的字典上设置值?我预计 b.hello 不会存在。 class MyClass(): datastore
我研究 Python 已经有一段时间了,我开始明白正确覆盖 __setattr__ 可能很麻烦(to say the least !)。 有哪些有效的方法可以确保/向我自己证明覆盖已正确完成?我特别关
在 Python 中,我知道可以这样说 >>> class C: ... def __setattr__(self, name, value): ... print("Hey, you c
我知道在 Python 中可以在运行时向类添加方法: class Test: def __init__(self): self.a=5 test=Test() import t
在 Python 类中,当我使用 __setattr__ 时,它优先于此类(或任何基类)中定义的属性。考虑以下代码: class Test(object): def get_x(self):
我正在尝试覆盖 Python 类的 __setattr__ 方法,因为我想在每次实例属性更改其值时调用另一个函数。但是,我不希望在 __init__ 方法中出现这种行为,因为在此初始化期间,我设置了一
我有以下代码: #-*-coding:utf-8-*- class A(object): def __init__(self, x): self.x = x def _
在 werkzeug 中,我们看到: class Local(object): __slots__ = ('__storage__', '__ident_func__') def __
我想定义一个返回 __setattr__ 的通用实现的函数,该函数使属性不可设置,除非它们是属性(我应该一般测试数据描述符,但那是稍后的事情) )。该函数如下所示: def make_setattr(
我的应用程序在 Windows 上运行,我正在尝试针对 Linux 对其进行配置。 我得到以下 AttributeError: Preferences instances has no attribu
我正在实现一个类的所有预定义函数,当我实现我的__setattr__() 来更新列表时我卡住了 class testop: def __init__(self): self.l
我有一个类的属性,我可以在检查其他属性后更改这些属性,所以我编写了这个类: class MyClass(): def __init__(self, x): self.x = x
在 __setattr__() 中有什么方法可以区分来自类或子/继承类内部的属性集,以及来自当前类或子类外部的属性集? 我想从“外部”更改设置属性的工作方式,在我制作模块的情况下,我希望用户在设置属性
我是一名优秀的程序员,十分优秀!