"未声明的变量" python中的声明

时间:2016-09-14 17:29:26

标签: python

以下代码是一个示例:

class A(object):
    def f(self):
        pass
A.f.b = 42

如何分配此变量?如果我声明A.f.a,A.f.b和A.f.c变量我是否创建了3个不同的A对象?有人可以解释内存中发生了什么(因为这似乎不是在C中容易编码的东西)吗?

2 个答案:

答案 0 :(得分:0)

A.b = 42将一个类变量添加到A,从而使A的每个实例立即可见(但内存中只有一个条目)

您可以随时在Python中为类和实例添加属性。最干净的方法是做宣告时间,否则这可能会产生误导。

class A:
    b = 12

但是对于快速"扩展"您可以选择动态添加它们的类或实例。

例如:

class A(object):
    pass

a = A()
print('b' in dir(a))  # False
A.b = 42
print('b' in dir(a))  # True even if instanciated before creation of `b`

答案 1 :(得分:0)

以下仅适用于Python 3:

class A(object):
    def f(self):
        pass
A.f.a = 41
A.f.b = 42
A.f.c = 43

A.ffunction类型的对象,您始终可以向function对象添加新属性。没有创建A个实例;这三个属性是从函数f本身引用的。

但是,如果您有两个实例a1 = A()a2 = A(),则a1.f.ba2.f.b都未定义,因为a1.f不是A.f的引用1}};它是对method类型的对象的引用。这是因为Python的描述符协议如何用于实现实例方法。