Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/codeigniter/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
类变量是在实例方法还是类方法的范围内? 类变量是否在为Python类定义的方法的范围内 如何访问方法(类方法、实例方法或静态方法)中的类变量并可能对其进行更改 最好的办法是什么?例如,我可能希望统计创建了多少个类实例_Python_Class_Methods_Scope - Fatal编程技术网

类变量是在实例方法还是类方法的范围内? 类变量是否在为Python类定义的方法的范围内 如何访问方法(类方法、实例方法或静态方法)中的类变量并可能对其进行更改 最好的办法是什么?例如,我可能希望统计创建了多少个类实例

类变量是在实例方法还是类方法的范围内? 类变量是否在为Python类定义的方法的范围内 如何访问方法(类方法、实例方法或静态方法)中的类变量并可能对其进行更改 最好的办法是什么?例如,我可能希望统计创建了多少个类实例,python,class,methods,scope,Python,Class,Methods,Scope,我读到类变量在方法参数列表的范围内。要在这里使用类变量,我应该把它称为“代码>计数器< /代码>,而不是 MyClass。计数器< /代码>,因为该类处于定义的中间,但是我可以在中引用< MyClass >计数器 >代码> >代码>方法。这是否意味着类在\uuuuu init\uuuu方法中被完全定义 编辑:我还想知道为什么计数器在方法的参数列表的作用域中,而不在方法体中 class MyClass(object): counter = 0 def __init__(self

我读到类变量在方法参数列表的范围内。要在这里使用类变量,我应该把它称为“代码>计数器< /代码>,而不是<代码> MyClass。计数器< /代码>,因为该类处于定义的中间,但是我可以在<代码>中引用< <代码> MyClass >计数器<代码> >代码> >代码>方法。这是否意味着类在
\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:所以您可以在当时将
    计数器
    作为本地名引用。但当类完成反求时