pyhton 类的普通方法,与@classmethod @staticmethod的区别

类的普通方法与@classmethod @staticmethod的区别

 

class A(object):
    '''
    #通过类名可以单独访问此方法 @classmethod 类方法,属于类!
    #通过类名可以单独访问此方法 @staticmethod ,该方法和外部的方法一样。将外部方法集成到此类中'''
    #  @classmethod修饰的方法class_foo()需要通过cls参数传递当前类对象。@staticmethod修饰的方法定义与普通函数是一样的。
    def __init__(self,m):
        self.m=m
        self.foo('我为参数')# 在类中 普通方法的调用  #普通的类方法foo()需要通过self参数隐式的传递当前类对象的实例。
        self.class_foo(44)
        self.static_foo(55)

    def foo(self, x):
        self.m=2
        print("执行方法foo(%s)" % (x))
        print('我是类对象整体self:', self)
    @classmethod  # 绑定A,通过类名调用,不用实例化直接调用
    def class_foo(self, x):  #cls相当于self,必须有,但不是参数
        print("执行方法class_foo(%s)" % (x))
        #print('cls:', cls)
    @staticmethod #@staticmethod修饰的方法函数与普通的类外函数,@staticmethod是把函数嵌入到类中的一种方式,
    def static_foo(x):#函数就属于类,同时表明函数不需要访问这个类。通过子类的继承覆盖,能更好的组织代码。
        print("执行方法static_foo(%s)" % x)
a = A(1)
a.foo('我为参数2') #类外调用方法
#self和cls的区别不是强制的,即通常用self来传递当前类对象的实例,cls传递当前类对象。
print(a.foo)
print(a.class_foo)

print(A.foo(a,'我为参数3'))#可用  foo如下方式可以使用正常,显式的传递实例参数a。

#通过类名可以单独访问此方法 @classmethod 类方法,属于类!
#通过类名可以单独访问此方法 @staticmethod ,该方法和外部的方法一样。将外部方法集成到此类中


#class_foo通过 类对象 或对象实例 调用。
A.class_foo('通过类名调用,不用实例化直接调用') #通过类名,不用实例化直接调用
a.class_foo('实例化调用') #实例化调用

#static_foo通过类对象或对象实例调用。
A.static_foo('通过类名,不用实例化直接调用')
a.static_foo('实例化调用')

调用:
#普通的类方法foo()与@classmethod修饰的方法class_foo()与@staticmethod修饰的方法  在类内部调用方法一样。由self.传递。

@classmethod @staticmethod作用

#不用实例化类,可通过类名单独访问此方法 @classmethod 类方法,属于类!方法中第一位为cls或self 。注意:在普通类方法前面加上@classmethod即可通过类名直接访问,不用实例化。
#不用实例化类,通过类名可以单独访问此方法 @staticmethod ,该方法和外部的方法一样。只是将方法集成到此类中。

你可能感兴趣的:(pytho类知识,Python知识块)