类变量是在实例方法还是类方法的范围内? 类变量是否在为Python类定义的方法的范围内 如何访问方法(类方法、实例方法或静态方法)中的类变量并可能对其进行更改 最好的办法是什么?例如,我可能希望统计创建了多少个类实例
我读到类变量在方法参数列表的范围内。要在这里使用类变量,我应该把它称为“代码>计数器< /代码>,而不是<代码> MyClass。计数器< /代码>,因为该类处于定义的中间,但是我可以在<代码>中引用< <代码> MyClass >计数器<代码> >代码> >代码>方法。这是否意味着类在类变量是在实例方法还是类方法的范围内? 类变量是否在为Python类定义的方法的范围内 如何访问方法(类方法、实例方法或静态方法)中的类变量并可能对其进行更改 最好的办法是什么?例如,我可能希望统计创建了多少个类实例,python,class,methods,scope,Python,Class,Methods,Scope,我读到类变量在方法参数列表的范围内。要在这里使用类变量,我应该把它称为“代码>计数器< /代码>,而不是 MyClass。计数器< /代码>,因为该类处于定义的中间,但是我可以在中引用< MyClass >计数器 >代码> >代码>方法。这是否意味着类在\uuuuu init\uuuu方法中被完全定义 编辑:我还想知道为什么计数器在方法的参数列表的作用域中,而不在方法体中 class MyClass(object): counter = 0 def __init__(self
\uuuuu init\uuuu
方法中被完全定义
编辑:我还想知道为什么计数器
在方法的参数列表的作用域中,而不在方法体中
class MyClass(object):
counter = 0
def __init__(self): # counter is in scope here. can be used as default argument
counter += 1 # Counter not in scope. Throws UnboundLocalError
def printCount(self):
print counter # Counter not in scope. Throws UnboundLocalError
在方法中,可以通过两种不同的方式访问类属性:
MyClass.counter
self
:
self.counter
self.counter += 1
这仅在没有实例属性屏蔽计数器
时有效self
上无法再访问class属性:
self.counter
self.counter += 1
将在第一次运行时设置实例属性,并且将不再访问class属性
如果要设置类属性,必须使用第一种寻址方法,然后:
class MyClass(object):
counter = 0
def __init__(self):
MyClass.counter += 1
def printCount(self):
# these both work:
print self.counter
print MyClass.counter
您不能在方法中将计数器
称为本地计数器。在类定义体之外,它们不是本地或全局名称。只有在内部才能做到这一点:
然后,使用新创建的本地命名空间和原始全局命名空间,在新的执行框架[…]中执行该类的套件。(通常,套件只包含函数定义。)当类的套件完成执行时,其执行帧将被丢弃,但其本地命名空间将被保存。[…]然后使用基类的继承列表和属性字典保存的本地名称空间创建类对象
换句话说,当Python执行
类
主体时,计数器
和初始化
和打印计数
是本地名称,在执行过程中,您可以将这些名称称为本地名称。因此,您可以使用计数器
为方法参数定义默认值,或基于该值进行计算。但是一旦构建了类,名称空间就不存在了,您将不得不引用MyClass.
。这里是另一个简单的解释:
class ClassA(object):
_counter = 0
def __init__(self, val):
self._counter = val
def show_me(self):
print 'Class variable: %d' % ClassA._counter
print 'Instance variable: %d' % self._counter
obj = ClassA(1000)
obj.show_me()
print ClassA.__dict__['_counter']
print obj.__dict__['_counter']
1。类变量是否在为Python类定义的方法范围内?
下面是类变量解释:
class ClassA(object):
_counter = 0
def __init__(self, val):
self._counter = val
def show_me(self):
print 'Class variable: %d' % ClassA._counter
print 'Instance variable: %d' % self._counter
obj = ClassA(1000)
obj.show_me()
print ClassA.__dict__['_counter']
print obj.__dict__['_counter']
- 由类的所有实例共享的变量李>
- 它在类内定义,但在类的任何方法之外李>
- 类变量可以通过使用变量名上的类名进行访问
Class\u name.\uu dict\uu
中,即共享给所有实例
注意:实例变量存储在Instance.\uu dict\uu
中,即仅存储到当前实例
注意:使用类名访问类变量总是一个好主意,以减少混淆,而不是过度写入实例变量
以下是片段:
class ClassA(object):
_counter = 0
def __init__(self, val):
self._counter = val
def show_me(self):
print 'Class variable: %d' % ClassA._counter
print 'Instance variable: %d' % self._counter
obj = ClassA(1000)
obj.show_me()
print ClassA.__dict__['_counter']
print obj.__dict__['_counter']
输出:
Class variable: 0
Instance variable: 1000
0
1000
class variable _counter : 1
instance variable _counter : 1
class variable _counter : 2
instance variable _counter : 4
class variable _counter : 3
instance variable _counter : 9
2。如何访问方法(类方法、实例方法或静态方法)中的类变量并可能对其进行更改?
您可以使用class_name dot variable name ie访问类变量
ClassA._counter
3。最好的办法是什么?例如,我可能希望统计创建了多少个类实例。
据我所知,重写\uuuuuu new\uuuuu
方法更好,因为\uuuuuuu new\uuuuu
正在调用创建和更新类变量\u计数器的每个对象,如下代码片段所示:
#!/usr/bin/python
class ClassA(object):
# this _counter is in the class.__dict__ which shared across all instance
_counter = 0
def __new__(cls, *args, **kw):
ob = super(ClassA, cls).__new__(cls, *args, **kw)
ClassA._counter += 1
return ob
def __init__(self, val):
# this _counter is in the instance dictionary which is not shared
self._counter = val*val
def total_instance(self):
return ClassA._counter
# Lets create three instance
for i in range(1,4):
obj = ClassA(i)
print 'class variable _counter : %d' % obj.total_instance()
print 'instance variable _counter : %d' % obj._counter
输出:
Class variable: 0
Instance variable: 1000
0
1000
class variable _counter : 1
instance variable _counter : 1
class variable _counter : 2
instance variable _counter : 4
class variable _counter : 3
instance variable _counter : 9
注意:在上面的示例中,我试图向您展示实例变量\u counter
和类变量\u counter
的区别
请让我知道这是否有帮助。我在这里要求解释原因。你应该得到UnboundLocalError
error而不是全局错误。UnboundLocalError:赋值前引用的局部变量“counter”
。因此,如果你阅读了链接到的答案,您会注意到应答者从未在方法体中引用计数器。。。因此,不,除非您按类名提及它,否则它不在范围内。当类主体完成执行变量counter
时,它已转换为Myclass.counter
,因此,要在方法中访问该变量,您需要使用类名或self
。也可以在参数列表中访问类变量,而无需使用类名作为前缀。请看我的编辑。谢谢。好的,如果您从参数列表中访问类变量,那么您可以增加它吗?计算实例数。你可以,但你需要写更多的代码。请你解释一下我在编辑中的问题,这是我真正想问的。谢谢:)@ajay:定义类时,class
语句中的所有内容都像函数一样执行<代码>计数器
是该“函数”中的局部变量,函数定义也是如此。该函数的本地命名空间将成为类主体。因此,计数器
是一个本地名,计数器
是另一个本地名,等等@ajay:所以您可以在当时将计数器
作为本地名引用。但当类完成反求时