安迪·海登的答案给你必要的修复,但我想你可以欣赏专门针对你的问题多一点背景。请注意,这里描述了所谓的“新”对象模型,尽管旧模型(从2.2天前开始,仍然是Python 2中的默认模式,运行几乎相同)。
当解释器编译一类是读取整个类体,并在字典中保存定义(在你的情况,someFunction
和__init__
)。它建立了一个“基类”(它继承的类)的列表,然后它调用类的元类(除非你采取特殊的行动,在Python中你的类的元类将是内置类型type
)与类名称,基类列表和表示类名字空间的字典作为参数。
在Python 3中,新模型是默认模型,您可以使用class
声明的关键字参数设置类的元类。这可以让你验证我的断言。考虑下面的程序:
class print_args(type):
def __new__(cls, name, bases, name_space):
print("class:", cls)
print("Declaring class", name)
print("Bases:", bases)
print("Namespace:", name_space)
return type.__new__(cls, name, bases, name_space)
class A: pass
class B: pass
print("Defining C")
class C(A, B, metaclass=print_args):
CVar = "class attribute"
def myMethod(self, a):
return self.N, self.CVar
def __init__(self, N):
self.N = N
print("Creating c")
c = C(42)
print(c.CVar, C.CVar)
print(C.__dict__)
print(c.__dict__)
c.CVar = "instance attribute"
print(c.CVar, C.CVar)
print(c.__dict__)
的print_args
类是一个简单元类,模仿的type
从它继承和一点印刷后实际的工作委托给type.__new__
的动作。当C
类被声明,它输出
Defining C
class: <class '__main__.print_args'>
Declaring class C
Bases: (<class '__main__.A'>, <class '__main__.B'>)
Namespace: {'__qualname__': 'C', '__module__': '__main__', '__init__': <function C.__init__ at 0x10778bbf8>, 'myMethod': <function C.myMethod at 0x10778bc80>, 'CVar': 'class attribute'}
注意,这一切都发生当C类被声明为- 您可以通过输出的下一行讲这个。另请注意,打印的值会告诉您传递给type.__new__
的内容。程序接下来会创建一个C
实例,并演示类属性也可以作为实例属性进行访问 - 方法解析顺序也应用于属性查找 - 实际上,实例也可以访问A
和B
类中的属性是任何。
Creating c
class attribute class attribute
此时C
类的__dict__
看起来是这样的:
{'CVar': 'class attribute',
'__module__': '__main__',
'__doc__': None,
'__init__': <function C.__init__ at 0x10778bbf8>,
'myMethod': <function C.myMethod at 0x10778bc80>}
及其实例的字典是这样的:
{'N': 42}
它仅包含实例属性N
。但是在将值绑定到c.CVar
之后,我们可以看到实例属性现在不同于类属性。
instance attribute class attribute
这通过实例的__dict__
的更新后的视图进行确认。
{'CVar': 'instance attribute', 'N': 42}
希望这会给你更多的洞察,当你声明类如何实例和类相关的情况,以及。
我不清楚你在这里问什么。你是否故意忽略'someFunction()'的'self'参数,并想知道为什么'__init __()'不能从封闭范围看到名字?或者你想知道调用方法的正确方法是什么?下一个问题的答案是Andy Hayden的答案如下。前一个问题的答案有一点涉及。 –
您能否解释为什么__init __()无法从封闭范围看到名称,这正是我想要问的。 – 7alman
相关:http://stackoverflow.com/questions/9505979/the-scope-of-names-defined-in-class-block-doesnt-extend-to-the-methods-blocks http://stackoverflow.com/问题/ 13937637/why-doesnt-class-start-a-new-scope-like-def-does –