Peteryo01223 发表于 2021-3-16 14:24:46

Python, 静态方法的优点

本帖最后由 Peteryo01223 于 2021-3-16 14:32 编辑

静态方法是类的特殊方法,静态方法只需要在普通方法的前边加上 @staticmethod 修饰符即可。
FishC 举例的 code 如下:
class C:
      @staticmethod# 该修饰符表示 static() 是静态方法
      def static(arg1, arg2, arg3):
                print(arg1, arg2, arg3, arg1 + arg2 + arg3)

      def nostatic(self):
                print("I'm the f**king normal method!")

静态方法最大的优点是:不会绑定到实例对象上,换而言之就是节省开销。
Code 运行结果如下:
>>> c1 = C()
>>> c2 = C()
# 静态方法只在内存中生成一个,节省开销
>>> c1.static is C.static
True
>>> c1.nostatic is C.nostatic #这里是在测试什么?为何code中定义的 print 内容没有显示?
False
>>> c1.static
<function C.static at 0x03001420>
>>> c2.static
<function C.static at 0x03001420>
>>> C.static
<function C.static at 0x03001420>
# 普通方法每个实例对象都拥有独立的一个,开销较大
>>> c1.nostatic
<bound method C.nostatic of <__main__.C object at 0x03010590>>
>>> c2.nostatic
<bound method C.nostatic of <__main__.C object at 0x032809D0>>
>>> C.nostatic
<function C.nostatic at 0x0328D2B8>

问题:
第6句和第7句在测试 nostatic,为什么结果为 false 呢?原 code 中,不是定义了 print 内容么?这里为什么没有被 Python 显示,而被判断为假?
望高人们,帮我扫盲,掰开揉碎,讲解之。

jackz007 发表于 2021-3-16 14:42:41

本帖最后由 jackz007 于 2021-3-16 14:52 编辑

      Python 中的 is 的作用是比较个标识符的内存地址,如果相等,得到 True,否则,得到 False

      <function C.static at 0x03001420>

      在这条信息中,标识符是 C.static,内存地址是 0x03001420

   在本例中,c1 . static、c2 . static、C . static 三个标识符指向同一个内存地址:<function C.static at 0x03001420>。
   所以,c1 . static is C . static 得到 True。

Peteryo01223 发表于 2021-3-16 14:51:53

本帖最后由 Peteryo01223 于 2021-3-16 14:53 编辑

jackz007 发表于 2021-3-16 14:42
Python 中的 is 的作用是比较个标识符的内存地址,如果相等,得到 True,否则,得到 False

       ...

好的。那么,是否表示:
@staticmethod确保了 def static 的静态方法;
而后面 def nostatic,由于缺少@staticmethod,导致c1.nostatic 与 C.nostatic 内存地址并不一致?

jackz007 发表于 2021-3-16 14:53:39

Peteryo01223 发表于 2021-3-16 14:51
好的。那么,是否表示:
@staticmethod确保了 def static 的静态方法;
而后面 def nostatic,由于缺 ...

       是的,静态方法绑定的是类,而普通方法绑定的是对象。

Peteryo01223 发表于 2021-3-16 14:54:41

jackz007 发表于 2021-3-16 14:53
是的,静态方法绑定的是类,而普通方法绑定的是对象。

棒。谢!

Vicissitude357 发表于 2022-8-28 10:50:22

谢谢
页: [1]
查看完整版本: Python, 静态方法的优点