Python 如何在没有dict的情况下创建类对象__
Python 如何在没有dict的情况下创建类对象__,python,class,python-3.x,Python,Class,Python 3.x,“A”是元类的实例“B”和“B”定义了\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu?如何在没有\uuuuu dict\uuuuuuuuu的情况下创建类对象?\uuuuuuuuu slots\uuuuuuuuuuu不会阻止您为类设置属性,您需要为此重写\uuuuuuuuuuuu setattr\uuuuuuuuuuuu。像这样的东西应该可以做到: c
“A”
是元类的实例“B”
和“B”
定义了\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu?如何在没有\uuuuu dict\uuuuuuuuu
的情况下创建类对象?\uuuuuuuuu slots\uuuuuuuuuuu
不会阻止您为类设置属性,您需要为此重写\uuuuuuuuuuuu setattr\uuuuuuuuuuuu
。像这样的东西应该可以做到:
class B(type):
__slots__ = ()
class A(metaclass=B):
pass
A.test = "test"
演示:
class B(type):
def __new__(cls, clsname, bases, dct):
dct['__slots__'] = ('x',)
return type.__new__(cls, clsname, bases, dct)
def __setattr__(cls, attr, val):
if attr not in cls.__slots__:
raise AttributeError('Can\'t set {!r}'.format(attr))
else:
type.__setattr__(cls, attr, val)
class A(metaclass=B):
pass
>A.x=1
>>>A.y=2
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
A.y=2
文件“C:\Python27\so.py”,第7行,在\uuu setattr中__
raise AttributeError('无法设置{!r}'。格式(attr))
AttributeError:无法设置“y”
您不能这样做;类始终具有\uuu dict\uuu
您只能在类上使用\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
来生成没有\uuuuuuuuuuuuuuuuuuuu。您通常只会生成几个类,因此在元类上支持\uuuuu\uuuuu
没有多大意义
不要使用\uuuuuuuuuuuuuuuuuuuu
来阻止设置属性。使用\uuuuu setattr\uuuuuu
代替:
>>> A.x = 1
>>> A.y = 2
Traceback (most recent call last):
File "<pyshell#2>", line 1, in <module>
A.y = 2
File "C:\Python27\so.py", line 7, in __setattr__
raise AttributeError('Can\'t set {!r}'.format(attr))
AttributeError: Can't set 'y'
为什么您想要一个没有\uuuuu dict\uuuu
的类?也许有不同的方法来解决这个问题。@NedBatchelder:是的,我想要一个没有dict的类。奇怪的是_slots_在classinstance中工作,而不在metaclassclass中工作。我认为内置类没有dict,但显然它没有显示在dir()中。例如,hasattr(int,'.'u dict'==True@Damamat:您还没有说明为什么想要一个没有\uuuu dict\uuuu
的类。口授有什么坏处?你能解释一下吗?纯粹是学术兴趣。所以没有办法定义一个实例已定义了\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
的元类(这样他们的实例就不会有\uuuuuuuu?这就是我认为OP想要实现的目标。@martineau:我不这么认为;那么为什么要测试A.test='test'
呢?哎呀,OP问的问题你是对的——我误解了这个问题+1.
class NoAttributesClassMeta(type):
def __setattr__(cls, name, value):
if name not in cls.__dict__:
raise AttributeError("Cannot set attributes")
type.__setattr__(cls, name, value)