马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 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: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。
|