Python类定义分配属性

时间:2012-08-07 16:53:04

标签: python

我尝试在空闲时执行这段代码并出现以下错误,

class Myclass():
    i = 1

x = Myclass()
x.y = 10
x.i=10
x.i
# 10
x.y
# 10

这个类只有1个属性'i',但是当我指定x.y = 10时,Python将如何允许它工作。这不是问题吗?我该如何防止它发生?

3 个答案:

答案 0 :(得分:3)

正如其他答案所提到的,这是一个功能而非错误。

如果您只想强制执行一组有限的属性,可以将__slots__new-style classes一起使用(从object继承的类):

class Myclass(object):
    __slots__ = ['i']

>>> x = Myclass()
>>> x.i = 10
>>> x.y = 10
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'Myclass' object has no attribute 'y'

答案 1 :(得分:2)

与许多其他语言(如Java)不同,Python会动态分配类成员。这意味着您不需要在类的定义中包含一个变量就可以分配给它。

另请注意,类变量与您指定的类变量之间存在差异:

class Myclass():
     i = 1

和一个班级成员:

class Myclass():
    def __init__(self):
        self.i = 1

答案 2 :(得分:0)

这就是你在Python中定义类变量的方法。您可以使用某些“魔术”功能来阻止此行为,但通常不建议这样做。