我已经看到了如何在类中创建静态变量的示例。这是一个例子:
class A:
_i = 0
@property
def i(self):
print(type(self)) # <class '__main__.A'>
return type(self)._i
@i.setter
def i(self, val):
type(self)._i = val
- 它是如何工作的?
type(self)如何工作并使这些变量静态? - 什么是
< class '__main__.A' >在 OOP 和多态性中是什么意思?
请您参考如下方法:
How type(self) works
它只返回 self 的类型。您可以在任何对象上调用 type 以获取其类型:
>>> type(2)
int
>>> class C(object): pass
>>> type(C)
type
>>> c = C()
>>> type(c)
__main__.C
(输出在 Python 2 和 Python 3 上或在不同的 Python 实现上看起来可能略有不同。)
… and make that variables are static?
首先,这些不是静态变量,它们是类变量。如果您没有任何继承权,那没有什么区别——但如果您有……我会回过头来讨论这一点。
如果您创建一个实例:
>>> a = A()
... 并为 i 赋值:
>>> a.i = 3
…它调用 i 属性的 setter ,将 a 作为 self 参数传递——就像普通方法调用一样。
所以,因为 self 是 a ,而 type(a) 是 A ,那么 type(self) 也是 A 。
这意味着 type(self)._i 是 A._i 。换句话说,它是类属性。
那么,为什么这是一个类属性而不是静态属性呢?好吧,让我们添加一个子类:
>>> a = A()
>>> class B(A):
... _i = 1
>>> b = B()
>>> b.i = 5
>>> A._i
0
>>> B._i
5
每个子类都可以有自己的 _i 。并且因为 setter 正在设置 type(self)._i ,当 self 是 b 时,所以 type(self) 是 B ,type(self)._i 是 B._i ,而不是 A._i 。
What does it
< class '__main__.A' >mean in OOP and polymorphism
在 Python 中,所有内容都有一个 repr ,供程序员使用,当您在交互式提示符下评估它时,它会被打印出来。它也被用作 str(由 print 打印的东西)如果没有更好的方式用作人类可读的(就像在真实的人类中,而不是我们程序员)表示。
一般来说,repr 是:
- 可以粘贴到您的代码中以产生相等值的字符串(如果这有意义且可能/合理的话)。
<>中的一个字符串,包括类型、某种识别信息(如果有的话)以及将该对象与其他实例区分开来的某种方法。
对于类型,您在尖括号内得到的是它是一个类(即 class 部分)和限定名称(即 __main__.A 部分,告诉您它是一个定义在顶层的名为 A 的类)名为 __main__ 的模块),这既是有用的标识符,也是将其与其他类区分开来的方法。
OOP 和多态性中的 is 是什么意思?我想不出一个好的答案。即使 Python 不支持多态性,即使它没有一流的类型,__main__.A 和 __main__.B 仍然是不同的对象,应该有不同的名称,对吧?
如果您想知道 __main__ 是什么类型的名称:那只是用于运行顶级脚本或交互式解释器 session 的特殊模块的名称。如果您曾经见过 if __name__ == '__main__': 守卫,那正是它正在测试的内容。
