Skip to main content
 首页 » 编程设计

Python OOP之解释 static 如何使用 type(self)

2025年05月04日19freeliver54

我已经看到了如何在类中创建静态变量的示例。这是一个例子:

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__': 守卫,那正是它正在测试的内容。