在Python中访问类的成员变量?

class Example(object):
    def the_example(self):
        itsProblem = "problem"

theExample = Example()
print(theExample.itsProblem)

我如何访问一个类的变量? 我试过添加这个定义:

def return_itsProblem(self):
    return itsProblem

但是,这也失败了。


用几句话来回答

在你的例子中, itsProblem是一个局部变量。

你必须使用self来设置和获取实例变量。 你可以在__init__方法中设置它。 那么你的代码将是:

class Example(object):
    def __init__(self):
        self.itsProblem = "problem"


theExample = Example()
print(theExample.itsProblem)

但是如果你想要一个真正的类变量,那么直接使用类名:

class Example(object):
    itsProblem = "problem"


theExample = Example()
print(theExample.itsProblem)
print (Example.itsProblem)

但要小心这一个,因为theExample.itsProblem被自动设定为等于Example.itsProblem ,但不是相同的变量在所有的,可以独立改变。

一些解释

在Python中,可以动态创建变量。 因此,您可以执行以下操作:

class Example(object):
    pass

Example.itsProblem = "problem"

e = Example()
e.itsSecondProblem = "problem"

print Example.itsProblem == e.itsSecondProblem 

打印

真正

因此,这正是你对前面的例子所做的。

事实上,在Python我们使用selfthis ,但它比这多一点。 Self是任何对象方法的第一个参数,因为第一个参数始终是对象引用。 这是自动的,不管你是否自称。

这意味着你可以这样做:

class Example(object):
    def __init__(self):
        self.itsProblem = "problem"


theExample = Example()
print(theExample.itsProblem)

要么:

class Example(object):
    def __init__(my_super_self):
        my_super_self.itsProblem = "problem"


theExample = Example()
print(theExample.itsProblem)

完全一样。 任何对象方法的第一个参数是当前对象,我们只把它self作为一个惯例。 而且你只给这个对象添加一个变量,就像你从外面做的那样。

现在,讲一下类变量。

当你这样做时:

class Example(object):
    itsProblem = "problem"


theExample = Example()
print(theExample.itsProblem)

你会注意到我们首先设置一个类变量 ,然后我们访问一个对象(实例)变量 。 我们从来没有设置这个对象变量,但它的工作原理,这怎么可能?

那么,Python试图首先获取对象变量,但如果它找不到它,会给你类变量。 警告:类变量在实例中共享,而对象变量不是。

作为结论,绝对不要使用类变量将默认值设置为对象变量。 使用__init__

最终,您将了解到Python类是实例,因此也是对象本身,这为了解上述提供了新的洞察。 一旦你意识到这一点,请稍后再阅读。


你正在声明一个局部变量,而不是一个类变量。 要设置实例变量(属性),请使用

class Example(object):
    def the_example(self):
        self.itsProblem = "problem"  # <-- remember the 'self.'

theExample = Example()
theExample.the_example()
print(theExample.itsProblem)

要设置类变量(又名静态成员),请使用

class Example(object):
    def the_example(self):
        Example.itsProblem = "problem"
        # or, type(self).itsProblem = "problem"
        # depending what you want to do when the class is derived.

如果你有一个实例函数(也就是一个被自我传递的函数),你可以使用self来获得对该类的引用self.__ __class__ __

例如,在下面的代码中,tornado创建了一个实例来处理get请求,但是我们可以获得get_handler类并使用它来保存get_handler客户端,因此我们不需要为每个请求创建一个。

import tornado.web
import riak

class get_handler(tornado.web.requestHandler):
    riak_client = None

def post(self):
    cls = self.__class__
    if cls.riak_client is None:
        cls.riak_client = riak.RiakClient(pb_port=8087, protocol='pbc')
    # Additional code to send response to the request ...
链接地址: http://www.djcxy.com/p/54273.html

上一篇: Accessing a class' member variables in Python?

下一篇: Why are instances of this class being overwritten?