Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在没有dict的情况下创建类对象___Python_Class_Python 3.x - Fatal编程技术网

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)