2017-09-07 18 views
0

我怎样才能在类的方法定义中引用一个类的共享?如何在类的方法定义中引用一个类的授权?

例如:

>>> class C: 
...  a = 3 
...  def f(self): 
...   # nonlocal a # nonlocal doesn't work                                        
...   # a = 4 # create a local variable a in f                                        
...   self.a = 4 
... 
>>> c=C() 
>>> C.a 
3 
>>> c.a 
4 

我怎么可以参考C.aC.f的定义是什么?

  • 目前self.a = 4将创建c.a这是从C.a不同。

  • 如果self.a = 4替换a = 4a将在C.f一个局部变量,而不是C.a

  • nonlocal a不作afC.a,我不知道为什么?

谢谢。


更新:

在类的定义,我什么时候有资格的属性,我当不得?举例来说,我不明白为什么以下是错误的:

>>> class C: 
...  C.b=4 
... 
>>> C.b 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
AttributeError: type object 'C' has no attribute 'b' 
>>> C.C.b 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
AttributeError: type object 'C' has no attribute 'C' 
+0

简单。使用'C.a = 4'。 –

+0

根据您的更新:这是相当深奥的。当你说“C.b = 4”时,“C”还不存在。您没有收到错误,因为您在执行此代码之前已经定义了不同的“C”类。输入“del C”然后再试一次,你会得到一个错误。您正在更新旧的“C”类的类变量,然后使用新的C类重新定义它。 – RobertB

回答

2

您需要使用类本身:

C.a = 4 

或潜在

self.__class__.a = 4 
+0

谢谢。当我用'a = 3'定义'C.a'时,为什么我不必把它写成'C.a = 3'?所以在一个类的定义里面,我何时可以引用它的没有限定符和点的属性,以及我什么时候需要? – Ben

+0

在创建类对象之前,'a'被初始化并绑定到名称'C'。在创建类对象后调用__init__,并且'class'语句不会创建对'__init__'主体可见的作用域。 – chepner

+0

当你在类中定义'a'时,它会被添加到类的名字空间中。这是合理的。当你在方法内部赋值'a'时,你需要使用类名称空间来解决它。 –

相关问题