5

我想知道您认为如何从类中的函数访问类属性。我没有在 PEP8 中找到参考资料或关于它的热门问题。例如

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

        # Way B:
        print(MyClass.BAR)

通过“self”访问似乎是合理的,因为该属性属于同一个类,对于明显的同类引用的密切引用。另一方面,通过类名本身进行访问是明确的,因为它是静态的,并且使使用的起源清晰,并且由于与类配对,因此可以更加清晰。

4

2 回答 2

6

明确命名类名时,您可以防止子类覆盖您的属性。

另一方面,使用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
于 2018-05-28T13:22:58.020 回答
1

对于读取而言,使用哪个并不重要 -self.BAR并且MyClass.BAR在语法上是等效的,除非您有一个类层次结构,其中子类重新定义BAR.

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

一般来说,对于类变量,MyClass.BAR如果您想要来自类层次结构中特定级别的特定变量,type(self).BAR或者self.__class__.BAR如果您想要继承安全的东西,那么您确实应该使用。这显然是一个类变量,并且避免了上述动态别名在运行时突然出现的问题。使用self只是烘烤一些脆弱性,将来很难发现。

于 2018-05-28T13:24:02.473 回答