Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.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_Instance - Fatal编程技术网

Python 所有类方法中的类变量访问

Python 所有类方法中的类变量访问,python,class,instance,Python,Class,Instance,我希望有一个类变量,以便可以在所有实例中访问该值,但我也希望在类内的方法中访问该变量。可能吗?我试过这个,但根本不起作用 class myClass: myvariable = 1 def add(): myvariable+= 1 def print1(): print myvariable 我想创建两个实例,一个只做add方法,另一个只做print1方法是的,只需访问类对象上的变量: class myClass(object): myv

我希望有一个类变量,以便可以在所有实例中访问该值,但我也希望在类内的方法中访问该变量。可能吗?我试过这个,但根本不起作用

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属性一样

虽然您也可以通过
self
获取class属性(
print self.myvariable
),但这里显式优于隐式,并且避免了意外地被同名的实例属性遮罩。设置类属性始终必须在类上完成;将其设置为
self
将创建或更新实例属性(非共享)

但是要从
object
继承类;使用新样式的类有很多优点,至少
type(self)
将实际返回该类。在旧式类中(不是从
对象继承的
),您必须使用
self.\uuu class\uuu

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


你忘了方法中的
self
了吗?@MauroBaraldi:确实忘了。或者,更简单的是,你可以通过
self
访问类变量@Marcin:no,在访问
self
时不能设置。如果您同时拥有一个实例和一个类属性,那么您肯定需要直接在类上访问它。还有显式优于隐式。啊,我没想到这是关于变异共享变量的。
class myClass(object):
    myvariable = 1

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

    def print1(self):
        print type(self).myvariable
class myClass(object):
    myvariable = 1

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

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