python - 所有类方法中的类变量访问

标签 python class instance

我想要一个类变量,以便可以在所有实例中访问该值,但我还想在类内部的方法中访问该变量。那可能吗?我试过这个,但根本没用。

class myClass:
   myvariable = 1

   def add():
      myvariable+= 1

   def print1():
      print myvariable

我想创建两个实例,一个只做add方法,另一个只做print1方法

最佳答案

是的,只需访问类对象上的变量:

class myClass(object):
    myvariable = 1

    def add(self):
        myClass.myvariable += 1

    def print1(self):
        print myClass.myvariable

或者如果你想为每个子类设置它,使用type(self):

class myClass(object):
    myvariable = 1

    def add(self):
        type(self).myvariable += 1

    def print1(self):
        print type(self).myvariable

不同的是,后者在设置时会在任何子类上创建一个单独的属性,屏蔽基类属性。这就像在实例上设置属性会掩盖类属性一样。

尽管您也可以通过self获取类属性(print self.myvariable),但这里显式优于隐式,并且避免意外地被同名的实例属性掩盖。设置类属性总是必须在类上完成;将其设置为 self 将改为创建或更新实例属性(不共享)。

尽管如此,请务必从object 继承您的类;使用新式类有很多优点,尤其是 type(self) 将实际返回该类。在旧式类(不是继承自 object)中,您必须改用 self.__class__

使用 object 作为基础也为您提供了第三种选择,使用 @classmethod decorator 的类方法;当您只需要访问类对象而不是实例时使用这些。这些方法绑定(bind)到当前(子)类,因此它们对类属性的影响与使用 type(self) 相同:

class myClass(object):
    myvariable = 1

    @classmethod
    def add(cls):
        cls.myvariable += 1

    @classmethod
    def print1(cls):
        print cls.myvariable

关于python - 所有类方法中的类变量访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26626653/

相关文章:

c++ - C++ 类中的构造函数

c# - CollectionChanged 获取保存集合的对象的实例

java - 泛型类和非静态方法

django - 如何在 Django 多对多关系中删除中间模型的实例?

python - 如何使函数对列表进行两次迭代,从上次停止的地方继续?

python - 将一列转换为数字

python - 为什么 a = a ['k' ] = {} 创建一个无限嵌套的字典?

python - 我应该重复打开/关闭文件还是长时间保持打开状态(约 1 周)?

java - 如何在Java中创建可以代表两种不同类型的对象类型

javascript - react 如何识别它是类组件还是功能组件?