我想知道您如何从类中的函数访问类属性。我没有在PEP8中找到一个参考或一个关于它的流行问题。 e.g。
class MyClass(object):
BAR = 1
def foo(self):
# Way A:
print(self.BAR)
# Way B:
print(MyClass.BAR)
通过'self'访问似乎是合理的,因为属性由同一个类拥有,对于明显的同类引用具有近距离引用。 另一方面,通过类名本身进行访问很清楚,因为它是静态的,并且使用的起源清晰,并且可以更清晰,因为它与类'名称配对。 p>
答案 0 :(得分:6)
当 explicity 命名类名时,您可以阻止覆盖您的属性的子类。
另一方面,使用 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
答案 1 :(得分:1)
对于读取,使用哪个并不重要 - self.BAR
和MyClass.BAR
在语法上是等效的,除非您有一个类层次结构,其中子类重新定义BAR
的值。
对于写作,他们不一样。写入self.BAR
将有效地创建一个新变量,该变量是self
对象实例的本地变量,因此来自另一个对象实例的self.BAR
的任何读取都不会看到修改。这些调试可能非常糟糕,因为从代码中可以看出应该发生什么,因为它对时序敏感。
一般来说,对于类变量,如果你想要类层次结构中特定级别的特定变量,你真的应该使用MyClass.BAR
,如果你想要某些东西,可以使用type(self).BAR
或self.__class__.BAR
是继承安全的。这显然是一个类变量,避免了上面列出的问题,在运行时弹出动态别名。使用self
只会掩盖一些未来很难发现的脆弱性。