我正在尝试创建2个对象,
A
定义为常规Python类B
通过动态创建属性。一旦创建了两个类,我就会尝试打印他们的字典,并注意到对于动态创建的B类,未列出属性“X”。
class A(object):
def __init__(self,x,y):
self.x = 0
self.y = 0
x = A(1,2)
print "Class A directory =",dir(x)
class B:pass
B().x = 5
y = B()
print "Class A directory =",dir(y)
输出
Class A directory = ['__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'x', 'y']
Class B directory = ['__doc__', '__module__']
答案 0 :(得分:7)
B()
创建B的实例。执行B().x = 5
时,创建实例,设置x
属性,然后丢弃实例(因为您没有分配实例)任何事情B()
。然后使用y = B()
创建另一个实例,但此实例不受您对前一个实例的影响。
你可以这样做:
y = B()
y.x = 5
但是,您有一些术语误解。在您的两个示例中,您在实例上调用dir
,而不是类。如果您打印dir(A)
或dir(B)
,您会看到x
属性在任何一种情况下均未列出,因为它仅存在于类的实例上,而不存在于类本身上。
另外,说“B动态创建”而A“被定义为常规Python类”并不正确。它们都是常规的Python类。只是类A定义为在初始化中创建属性x
,而类B
不是(然后您稍后向其实例添加属性)。 B类仍然是一个普通的Python类,它只是具有与A不同的定义行为。(注意,您可以像对待B一样添加额外的属性到A的实例,通过执行类似x = A(); x.newAttr = "blah"
的操作。)
另外,你在标题中提到了元类,但你根本就没有使用元类。