0

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

  1. A通过定义为常规 Python 类
  2. 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__']
4

1 回答 1

8

B()创建 B 的一个实例。当你这样做时B().x = 5,你创建一个实例,设置x属性,然后丢弃该实例(因为你没有将 分配B()给任何东西)。然后你用 来创建另一个实例y = B(),但是这个实例不受你对前一个实例所做的影响。

你可以做:

y = B()
y.x = 5

但是,您对术语有一些误解。在您的两个示例中,您都在调用dir实例而不是类。如果您打印dir(A)or dir(B),您将看到该x属性在任何一种情况下都没有列出,因为它只存在于类的实例上,而不存在于类本身上。

此外,说 B 是“动态创建的”而 A 是“定义为常规 Python 类”是不正确的。它们都是普通的 Python 类。只是类 A 被定义为x在初始化时创建一个属性,而类B不是(然后您稍后将一个属性添加到它的实例中)。B 类仍然是一个普通的 Python 类,它只是具有与 A 不同的定义行为。(请注意,您可以像为 B 所做的那样向 A 的实例添加额外的属性,方法是执行类似的操作x = A(); x.newAttr = "blah"。)

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

于 2013-09-12T20:11:14.603 回答