Python类 - 属性不可见

时间:2013-09-12 20:09:35

标签: python

我正在尝试创建2个对象,

  1. A定义为常规Python类
  2. B通过动态创建属性。
  3. 一旦创建了两个类,我就会尝试打印他们的字典,并注意到对于动态创建的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__']
    

1 个答案:

答案 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"的操作。)

另外,你在标题中提到了元类,但你根本就没有使用元类。