我想知道您认为如何从类中的函数访问类属性。我还没有在 PEP8 中找到参考资料,也没有找到关于它的常见问题。例如
class MyClass(object):
BAR = 1
def foo(self):
# Way A:
print(self.BAR)
# Way B:
print(MyClass.BAR)
通过“self”访问似乎是合理的,因为该属性属于同一个类,紧密引用明显的同类引用。 另一方面,通过类名本身进行访问很清晰,因为它是静态的,并且使使用的起源清晰,并且由于它与类'name配对,因此也可以更清晰。
当明确命名类名时,可以防止子类覆盖您的属性。
另一方面,使用 self 可以给你带来灵活性。考虑以下代码:
class MyClass(object):
BAR = 1
def foo(self):
# Way A:
print(self.BAR)
# Way B:
print(MyClass.BAR)
class SubClass(MyClass):
BAR = 2
class SubClass2(MyClass):
pass
# output
>>> a = SubClass()
>>> a.foo()
2
1
>>> b = SubClass2()
>>> b.foo()
1
1
对于读取来说,使用哪个并不重要 -
self.BAR
和 MyClass.BAR
在语法上是等效的,除非你有一个类层次结构,其中子类重新定义了 BAR
的值。
对于写入来说,它们不一样。写入
self.BAR
将有效地创建一个新变量,该变量是 self
对象实例的本地变量,因此从另一个对象实例读取 self.BAR
将不会看到修改。这些调试起来非常糟糕,因为从代码中看不出应该发生什么,因为它对时间敏感。
一般来说,对于类变量,如果您想要类层次结构中特定级别的特定变量,您确实应该使用
MyClass.BAR
,或者如果您想要继承安全的东西,则应该使用 type(self).BAR
或 self.__class__.BAR
。这显然是一个类变量,并且避免了上面概述的动态别名在运行时突然出现的问题。使用 self
只会增加一些脆弱性,将来很难发现。