在Python中访问类的成员variables?

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

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

 def return_itsProblem(self): return itsProblem 

但是,这也失败了。

用几句话来回答

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

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

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

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

 class Example(object): itsProblem = "problem" theExample = Example() print(theExample.itsProblem) print (Example.itsProblem) 

但是要小心这个,因为Example.itsProblem被自动设置为等于Example.itsProblem ,但不是相同的variables,并且可以独立地更改。

一些解释

在Python中,variables是dynamic创build的。 因此,您可以执行以下操作:

 class Example(object): pass Example.itsProblem = "problem" e = Example() e.itsSecondProblem = "problem" print Example.itsProblem == e.itsSecondProblem 

打印

真正

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

事实上,在Python中,我们使用self ,但是比这更多。 Self是任何对象方法的第一个参数,因为第一个参数总是对象引用。 这是自动的,不pipe你是否自称。

这意味着你可以这样做:

 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) 

完全一样。 ANY对象方法的第一个参数是当前对象,我们只把它称为约定。 而且你只是给这个对象添加一个variables,就像你从外面做的那样。

现在,关于类variables。

当你这样做时:

 class Example(object): itsProblem = "problem" theExample = Example() print(theExample.itsProblem) 

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

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

总之,不要使用类variables来设置对象variables的默认值。 使用__init__

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

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

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

要设置一个类variables (又名静态成员),请使用

 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创build了一个实例来处理get请求,但是我们可以获得get_handler类并使用它来保存get_handler客户端,所以我们不需要为每个请求创build一个。

 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语句! 你应该很好。 我希望它可以帮助别人…

  class Example(object): def the_example(self): itsProblem = "problem" return itsProblem theExample = Example() print theExample.the_example()