访问类中类属性的pythonic方法

时间:2018-05-28 13:17:22

标签: python reference class-attribute

我想知道您如何从类中的函数访问类属性。我没有在PEP8中找到一个参考或一个关于它的流行问题。 e.g。

class MyClass(object):
    BAR = 1
    def foo(self):
        # Way A:
        print(self.BAR)

        # Way B:
        print(MyClass.BAR)

通过'self'访问似乎是合理的,因为属性由同一个类拥有,对于明显的同类引用具有近距离引用。 另一方面,通过类名本身进行访问很清楚,因为它是静态的,并且使用的起源清晰,并且可以更清晰,因为它与类'名称配对。 p>

2 个答案:

答案 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.BARMyClass.BAR在语法上是等效的,除非您有一个类层次结构,其中子类重新定义BAR的值。

对于写作,他们不一样。写入self.BAR将有效地创建一个新变量,该变量是self对象实例的本地变量,因此来自另一个对象实例的self.BAR的任何读取都不会看到修改。这些调试可能非常糟糕,因为从代码中可以看出应该发生什么,因为它对时序敏感。

一般来说,对于类变量,如果你想要类层次结构中特定级别的特定变量,你真的应该使用MyClass.BAR,如果你想要某些东西,可以使用type(self).BARself.__class__.BAR是继承安全的。这显然是一个类变量,避免了上面列出的问题,在运行时弹出动态别名。使用self只会掩盖一些未来很难发现的脆弱性。