为了账号安全,请及时绑定邮箱和手机立即绑定

Python中的实例变量与类变量

Python中的实例变量与类变量

侃侃尔雅 2019-06-26 16:33:34
我有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):     passPython中的实例变量与类变量
查看完整描述

3 回答

?
慕容3067478

TA贡献1773条经验 获得超3个赞

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


查看完整回答
反对 回复 2019-06-26
?
HUWWW

TA贡献1874条经验 获得超12个赞

进一步呼应迈克和亚历克斯的建议,增加我自己的色彩.

使用实例属性是典型的、更惯用的Python。类属性不是Oft使用的-至少在我连续13年以上的Python中的生产代码中是如此。静态方法和类方法也是如此.只是不太常见,除非有一个特定的用例或者一个不正常的程序员想要炫耀,他们知道Python编程的一些晦涩的角落。

Alex在他的回复中提到,访问将(稍微)快一点,因为查找的级别减少了一次.让我进一步澄清那些还不知道这是如何工作的人,它非常类似于变量访问-搜索按以下顺序进行:

  1. 本地人
  2. 非本地人
  3. 全球
  4. 内置

对于属性访问,顺序是:

  1. 实例
  2. 班级,等级
  3. 由MRO(方法解析顺序)确定的基类

在上面的例子中,假设您正在查找path属性。当它遇到类似于“self.path“,Python将首先查看实例属性以获得匹配;如果失败,它将检查对象从其中实例化的类。最后,它将搜索基类。正如Alex所说,如果在实例中找到属性,它将不会遵从类,因此节省了一点点时间。

然而,如果您坚持类属性,您将不得不放弃这一点的性能,,另一种选择是通过类而不是实例引用对象,例如,MyController.path而不是self.path..这是一个直接查找,它将绕过延迟查找,但是正如Alex下面提到的,这是一个全局变量,因此您丢失了您认为要保存的那个位(除非您创建了一个对[全局]类名的本地引用)。


查看完整回答
反对 回复 2019-06-26
?
largeQ

TA贡献2039条经验 获得超7个赞

当有疑问时,您可能需要一个实例属性。

类属性最好保留给有意义的特殊情况。唯一非常常见的用例是方法。不是不寻常将类属性用于实例需要知道的只读常量(尽管这样做的唯一好处是如果您也希望从(类),但是您当然应该谨慎地存储它们中的任何状态,这很少是您想要的。即使只有一个实例,也应该像编写其他类一样编写类,这通常意味着使用实例属性。


查看完整回答
反对 回复 2019-06-26
  • 3 回答
  • 0 关注
  • 571 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信