2014-10-29 50 views
1

我想要一个类变量,以便该值可以在所有实例中都可以访问,但是我也想访问该类中的方法中的变量。那可能吗?我已经尝试过,但完全没有效果。所有类方法中的类变量访问

class myClass: 
    myvariable = 1 

    def add(): 
     myvariable+= 1 

    def print1(): 
     print myvariable 

我想让两个实例,一个只能做添加方法,其他的只能做PRINT1方法

回答

6

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

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 

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

虽然可以通过得到self类属性以及(print self.myvariable),明确优于隐式在这里,并且避免被意外同名的实例属性掩盖。设置类属性总是必须在类上完成;将其设置为self将创建或更新实例属性,而不是共享。

尽管继承了object的类,使用新式课程有很多优点,但至少type(self)将实际返回课程。在旧式课程中(不是从object继承),您必须改用self.__class__

使用object作为基础也给你第三种选择,类方法与@classmethod decorator;当你只需要访问类对象而不是实例时使用它们。这些方法绑定到当前(亚)类的,所以他们的阶级属性的效果是一样的使用type(self)

class myClass(object): 
    myvariable = 1 

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

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

不要忘了你的方法'self'? – 2014-10-29 09:36:57

+0

@MauroBaraldi:我确实。 – 2014-10-29 09:45:41

+0

或者,更容易,你可以通过'self'访问类变量。 – Marcin 2014-10-29 09:56:31