python基础(面向对象设计(静态方法、类方法))

面向对象设计

类方法

类属性就是针对类对象定义的属性

使用赋值语句在class关键字下方可以定义类属性

类属性用于记录与这个类相关的特征

在程序运行时,类同样会被加载到内存,在python中,类是一个特殊的对象--类对象

类对象在内存中只有一份

除了封装实例的属性和方法外,类对象还可以拥有自己的属性和方法

类方法就是针对类对象定义的方法

在类方法内部可以直接访问类属性或者调用其他的类方法

语法如下:

@classmethod

def 类方法名(cls):

     pass

类方法需要用修饰器@classmethod来标识,告诉解析器这是一个类方法

类方法的第一个参数应该是cls

由哪一个类调用的方法,方法内的cls就是哪一个类的引用

这个参数和实例方法的第一个参数是self类似

提示使用其他名称也可以,不过习惯使用cls

通过类名,调用类方法,调用方法时,不需要传递cls参数

在方法内部:

可以通过cls(类名).属性(类属性)访问类的属性

也可以通过cls(类名).方法名(类方法(cls))调用其他的类方法,该类的所有对象共享通过类名直接访问

静态方法

在开发时,如果需要在类中封装一个方法,这个方法:

既不需要访问实例属性或者调用实例方法

也不需要访问类属性或者调用类方法

这个时候,可以把这个方法封装成一个静态方法

语法如下:

@staticmethod

def 静态方法名():

     pass

静态方法需要用修饰器@staticmethod来标识,告诉解释器这是一个静态方法

通过类名.调用静态方法

静态方法和类方法的创建:将它们分别包装在staticmethod和classmethod类的对象中。静态方法的定义中没有参数self,可直接通过类来调用。类方法的定义中包含类似于self的参数,通常被命名为cls。对于类方法,也可通过对象直接调用,但参数cls将自动关联到类。下面是一个简单的示例:


class MyClass: 
    def smeth():

         print('This is a static method') 
         smeth = staticmethod(smeth) 
    def cmeth(cls): 
         print('This is a class method of', cls) 
         cmeth = classmethod(cmeth) 
像这样手工包装和替换方法有点繁琐。在Python 2.4中,引入了一种名为装饰器的新语法,可用于像这样包装方法。(实际上,装饰器可用于包装任何可调用的对象,并且可用于方法和函数。)可指定一个或多个装饰器,为此可在方法(或函数)前面使用运算符@列出这些装饰器(指定了多个装饰器时,应用的顺序与列出的顺序相反)。
class MyClass: 
   @staticmethod 
   def smeth(): 
       print('This is a static method') 
   @classmethod 
   def cmeth(cls): 
       print('This is a class method of', cls) 
定义这些方法后,就可像下面这样使用它们(无需实例化类):
>>> MyClass.smeth() 
This is a static method 
>>> MyClass.cmeth() 
This is a class method of <class '__main__.MyClass'> 
在Python中,静态方法和类方法以前一直都不太重要,主要是因为从某种程度上说,总是可以使用函数或关联的方法替代它们,而且早期的Python版本并不支持它们。因此,虽然较新的代码没有大量使用它们,但它们确实有用武之地(如工厂函数)。

案例小结:

实例方法--方法内部需要访问实例属性,调用实例方法,实例化对象.实例属性,实例化对象.实例方法

实例方法内部可以使用类名.访问类属性

类方法--方法内部只需要访问类属性,调用类方法,类名.类属性,类名.类方法

静态方法--方法内部,不需要访问实例属性和类属性

提问:

如果方法内部即需要访问实例属性,有需要访问类属性,应该定义成什么方法?

答案:

应该定义实例方法

因为,类只有一个,在实例方法内部可以使用类名,访问类属性

自定制classmethod类方法

class ClassMethod:
    def __init__(self,func):   #func = say_hi
        self.func=func
    def __get__(self, instance, owner): #类来调用,instance为None,owner为类本身(people),实例来调用,instance为实例(p1),owner为类本身(people)
        def feedback(*args,**kwargs):
            print('在这里可以加功能啊...')
            return self.func(owner,*args,**kwargs)   #say_hi(People,*args,**kwargs)
        return feedback

class People:
    name='linhaifeng'
    @ClassMethod # say_hi=ClassMethod(say_hi)
    def say_hi(cls,msg,x):
        print('你好啊,帅哥 %s %s %s' %(cls.name,msg,x))

People.say_hi('你是那偷心的贼',10)

p1=People()
p1.say_hi('你是那偷心的贼',10)

猜你喜欢

转载自blog.csdn.net/jamfiy/article/details/88062916