【问题标题】:Class Properties not declared未声明的类属性
【发布时间】:2016-01-04 21:44:33
【问题描述】:

当某些类属性没有声明时,这段代码如何工作?

A 类声明时只有一个属性 aa 但是可以将其他属性“分配”给对象 A,这些属性存储在列表 L 中,以后可以引用。

class A(object):
     aa = ''

L = []

One = A()
L.append(One)

One.Type = 'One_Type'
One.Name = 'One'
One.Top = 200
One.Left = 50

Two = A()
L.append(Two)

Two.Type = 'Two_Type'
Two.Name = 'Two'
Two.Text = 'Hello'

One.XXX = 'XXX'

for i in range(len(L)):  
    for key, value in L[i].__dict__.items():
        print(L[i].Name, key, value)#, L[i].Type)
    print    
print

结果如下:

('One', 'Top', 200)
('One', 'XXX', 'XXX')
('One', 'Type', 'One_Type')
('One', 'Name', 'One')
('One', 'Left', 50)

('Two', 'Text', 'Hello')
('Two', 'Type', 'Two_Type')
('Two', 'Name', 'Two')

【问题讨论】:

  • Python 是动态的,您可以在运行时将您喜欢的任何属性分配给您的自定义类(除非您正在使用例如__slots__,具有子类namedtuple 等)。

标签: python class oop


【解决方案1】:

如果您真的需要限制给定类成员可用的属性数量,请在类定义中使用__slots__。在 python 交互式 shell 中考虑这个例子:

>>> class A(object):
...     __slots__ = ('some', 'other')
...     def __init__(self):
...         self.some = 1
...         self.other = 2
>>> a = A()
>>> a.some
1
>>> a.some = 2
>>> a.some
2
>>> a.third = 3
Traceback (most recent call last):
  File "<bpython-input-13>", line 2, in <module>
    a.third = 3
AttributeError: 'A' object has no attribute 'third'

但实际上,对象属性的 Python 式方法通常是完全动态的:如果特定实例需要特定的唯一属性或方法,分配它并没有错。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-17
    • 2015-07-07
    相关资源
    最近更新 更多