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 |
然而,这也失败了。
简而言之,答案就在这里
在您的示例中,
必须使用
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) |
但是要注意这一点,因为
一些解释
在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中我们使用
这意味着你可以:
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) |
完全一样。任何对象方法的第一个参数都是当前对象,作为约定,我们只调用它
现在,关于类变量。
当你做的事:
1 2 3 4 5 6 | class Example(object): itsProblem ="problem" theExample = Example() print(theExample.itsProblem) |
您将注意到,我们首先设置一个类变量,然后访问一个对象(实例)变量。我们从来没有设置过这个对象变量但是它是有效的,这怎么可能呢?
Python试图首先获取对象变量,但如果找不到,它会给你类变量。警告:类变量在实例之间共享,而对象变量不共享。
作为结论,永远不要使用类变量将默认值设置为对象变量。为此使用
最后,您将了解到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使用
例如,在tornado下面的代码中创建一个实例来处理get请求,但是我们可以获得
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() |