Python中的实例变量与类变量

我有Python类,在运行时只需要一个实例,所以只需要每个类拥有一次属性,而不是每个实例就足够了。如果有多个实例(这不会发生),那么所有实例都应该具有相同的配置。我想知道以下哪个选项更好,还是更“熟能生巧”的Python。

类变量:

class MyController(Controller):

  path = "something/"
  children = [AController, BController]

  def action(self, request):
    pass

实例变量:

class MyController(Controller):

  def __init__(self):
    self.path = "something/"
    self.children = [AController, BController]

  def action(self, request):
    pass

Python中的实例变量与类变量

侃侃尔雅
浏览 572回答 3
3回答

慕容3067478

如果无论如何只有一个实例,那么最好让每个实例都使用所有变量,仅仅因为它们将被更快地访问(因为从类到实例的“继承”而减少一个级别的“查找”),并且没有任何不利因素来权衡这个小优势。

HUWWW

进一步呼应迈克和亚历克斯的建议,增加我自己的色彩.使用实例属性是典型的、更惯用的Python。类属性不是Oft使用的-至少在我连续13年以上的Python中的生产代码中是如此。静态方法和类方法也是如此.只是不太常见,除非有一个特定的用例或者一个不正常的程序员想要炫耀,他们知道Python编程的一些晦涩的角落。Alex在他的回复中提到,访问将(稍微)快一点,因为查找的级别减少了一次.让我进一步澄清那些还不知道这是如何工作的人,它非常类似于变量访问-搜索按以下顺序进行:本地人非本地人全球内置对于属性访问,顺序是:实例班级,等级由MRO(方法解析顺序)确定的基类在上面的例子中,假设您正在查找path属性。当它遇到类似于“self.path“,Python将首先查看实例属性以获得匹配;如果失败,它将检查对象从其中实例化的类。最后,它将搜索基类。正如Alex所说,如果在实例中找到属性,它将不会遵从类,因此节省了一点点时间。然而,如果您坚持类属性,您将不得不放弃这一点的性能,或,另一种选择是通过类而不是实例引用对象,例如,MyController.path而不是self.path..这是一个直接查找,它将绕过延迟查找,但是正如Alex下面提到的,这是一个全局变量,因此您丢失了您认为要保存的那个位(除非您创建了一个对[全局]类名的本地引用)。

largeQ

当有疑问时,您可能需要一个实例属性。类属性最好保留给有意义的特殊情况。唯一非常常见的用例是方法。不是不寻常将类属性用于实例需要知道的只读常量(尽管这样做的唯一好处是如果您也希望从外(类),但是您当然应该谨慎地存储它们中的任何状态,这很少是您想要的。即使只有一个实例,也应该像编写其他类一样编写类,这通常意味着使用实例属性。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python