如何访问Python中的类的成员变量?

1
2
3
4
5
6
class Example(object):
    def the_example(self):
        itsProblem ="problem"

theExample = Example()
print(theExample.itsProblem)

如何访问类的变量?我试着加上这个定义:

1
2
def return_itsProblem(self):
    return itsProblem

然而,这也失败了。


简而言之,答案就在这里

在您的示例中,itsProblem是一个局部变量。

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

1
2
3
4
5
6
7
class Example(object):
    def __init__(self):
        self.itsProblem ="problem"


theExample = Example()
print(theExample.itsProblem)

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

1
2
3
4
5
6
7
class Example(object):
    itsProblem ="problem"


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

但是要注意这一点,因为theExample.itsProblem被自动设置为等于Example.itsProblem,但是根本不是相同的变量,可以独立更改。

一些解释

在Python中,变量可以动态创建。因此,您可以做以下工作:

1
2
3
4
5
6
7
8
9
class Example(object):
    pass

Example.itsProblem ="problem"

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

print Example.itsProblem == e.itsSecondProblem

打印

True

因此,这正是您在前面的示例中所做的。

实际上,在Python中我们使用self作为this,但是它比这要多一点。self是任何对象方法的第一个参数,因为第一个参数总是对象引用。这是自动的,不管您是否将其称为self

这意味着你可以:

1
2
3
4
5
6
7
class Example(object):
    def __init__(self):
        self.itsProblem ="problem"


theExample = Example()
print(theExample.itsProblem)

或者:

1
2
3
4
5
6
7
class Example(object):
    def __init__(my_super_self):
        my_super_self.itsProblem ="problem"


theExample = Example()
print(theExample.itsProblem)

完全一样。任何对象方法的第一个参数都是当前对象,作为约定,我们只调用它self。你给这个对象添加一个变量,和你从外面做的一样。

现在,关于类变量。

当你做的事:

1
2
3
4
5
6
class Example(object):
    itsProblem ="problem"


theExample = Example()
print(theExample.itsProblem)

您将注意到,我们首先设置一个类变量,然后访问一个对象(实例)变量。我们从来没有设置过这个对象变量但是它是有效的,这怎么可能呢?

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

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

最后,您将了解到Python类是实例,因此是对象本身,这为理解上述内容提供了新的视角。当你意识到这一点的时候,回头再读一遍。


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

1
2
3
4
5
6
7
class Example(object):
    def the_example(self):
        self.itsProblem ="problem"  # <-- remember the 'self.'

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

要设置类变量(也称为静态成员),请使用

1
2
3
4
5
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使用self.__class__获得对该类的引用

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

1
2
3
4
5
6
7
8
9
10
11
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 ...

实现return语句,如下面的示例所示!你应该表现得很好。我希望它能帮助一些人…

1
2
3
4
5
6
7
8
class Example(object):
    def the_example(self):
        itsProblem ="problem"
        return itsProblem


theExample = Example()
print theExample.the_example()