首页 新闻 会员 周边 捐助

python类中真的有静态方法非静态方法之分吗

0
悬赏园豆:80 [已关闭问题] 关闭于 2016-06-22 12:49

 

class C:
    
    @staticmethod
    def sf():
        print(C.sf)
    
    @classmethod
    def cf(cls):
        print(C.cf)
        
    def f():
        print(C.f)
     
    def f(self):
         pass

如上代码,python类中有4中定义方法的方式,请看我下面的问题补充,谢谢

问题补充:

我还发现:python类里的任何方法都可以分别用 类.方法名 和 实例.方法名调用。只是用 实例.方法 调用时,默认第一个参数是实例本身,像这样也是可以的:

class C:
    
    def f(self):
        print(C.f)
    
        
c = C()

C.f(c)
c.f()

那是不是可以这样理解:python中没有像C#,Java里这样的实例方法,静态方法之分。仅仅是如果用 实例.方法 调用时编译器默认把第一个参数赋值了实例本身。

 

----------------------------------

我这样理解对不对:

  1. python中一般定义的方法形如:def fname(self),可以这样调用:实例.fname()。编译器会默认加一个参数,就是实例本身。也可以这样调用:类名.fname(实例)
  2. 形如 def fname()的方法,只可以使用 类名.fname()的模式调用,不可以使用 实例名.fname()的方式调用,因为编译器会自动加个参数(实例本身),和fname的参数不一致,报错
  3. 为了解决2的问题,python官方引入了 @staticmethod修饰(其实就是个装饰器),这样就可以形如 实例.fanme() 调用了
  4. @classMethod修饰符完全是为了让程序员少写字,编译器默认会将实例对应的类型或类型本身作为参数传递
  5. 综上所述:python作者为了方便调用,而设计了系统自动补齐第一个参数为实例本身的功能,后来导致了问题2,于是打了补丁而出现了修饰符@staticmethod ,作者因为想不起更好的名字所有就叫 staticmethod了。There are only two hard things in Computer Science: cache invalidation and naming things.
会长的主页 会长 | 专家六级 | 园豆:12463
提问于:2016-06-17 06:43
< >
分享
所有回答(1)
0

找大师 哈哈

二十二号同学 | 园豆:790 (小虾三级) | 2016-06-17 09:27

大师也用python?

支持(0) 反对(0) 会长 | 园豆:12463 (专家六级) | 2016-06-17 09:31

@会长: 大师现在  天天用的最多的就是 outlook  Excel Word.  没了。 PL Developer。

支持(0) 反对(0) 二十二号同学 | 园豆:790 (小虾三级) | 2016-06-30 11:13

@会长: Notepad++ 

支持(0) 反对(0) 二十二号同学 | 园豆:790 (小虾三级) | 2016-06-30 11:14
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册