zoukankan      html  css  js  c++  java
  • 静态方法、类方法和属性方法

    静态方法

      通过@staticmethod装饰器即可把其装饰的方法变为一个静态方法,什么是静态方法呢?其实不难理解,普通的方法,可以在实例化后直接调用,并且在方法里可以通过self.调用实例变量或类变量,但静态方法是不可以访问实例变量或类变量的,一个不能访问实例变量和类变量的方法,其实相当于跟类本身已经没什么关系了,它与类唯一的关联就是需要通过类名来调用这个方法

    应用:

      对与一个类,我们要调用它的一个方法,必须要绑定实例,而不能直接通过类名.方法名()的形式调用。因此,想要通过类来调用方法,而不是通过实例,可以使用静态方法@staticmethod类方法@classmethod的形式实现。

    #静态方法  只是名义上归类管理,实际上在静态方法里访问不了类或实例中 的任何属性
    class Dog(object):
        def __init__(self,name):
            self.name=name
        @staticmethod #实际上跟类本身已没什么关系,只是名义上是类的方法(与类无关,不能访问类里的任何属性和方法)
        def eat(self,name):
            print("%s is eating %s"%(self.name,name))
            
    d=Dog('sb')
    # d.eat('baozi')#出错  原因是eat需要一个self参数,但调用时却没有传递,没错,因为当eat变成静态方法后,再通过实例调用时就不会自动把实例本身当作一个参数传给self了
    #解决办法
    #1.调用时主动传递实例本身给eat方法
    #在eat中去掉self参数,但这也意味着,在eat中不能通过self.调用实例中的其他变量了
    d.eat(d,'baozi')
    #执行结果
    >>>sb is eating baozi
    
    

    类方法

    类方法通过@classmethod装饰器实现,类方法和普通方法的区别是, 类方法只能访问类变量,不能访问实例变量

    class Dog(object):
        name='SB' #类变量
        def __init__(self,name):
            self.name=name
        @classmethod #类方法只能访问类变量,不能访问实例变量
        def eat(self,name):
            print('%s is eating %s'%(self.name,name))
        def talk(self,something):
            print("%s is talking %s"%(self.name,something))
    
    d=Dog('Lulu')
    d.eat('Mantou')
    
    #执行结果
    
    SB is eating Mantou

    静态方法与类方法总结:

    • 静态方法其实就是一个定义在类中的方法,只是调用时可以不需要先对类进行实例化,直接用类调用即可。无论后面怎么继承,它的实现不变。
    • 类方法也在调用时也不需要先对类进行实例化,但是它的实现,在继承时是跟随当前的子类的(因为它的第一个参数永远是cls)
    • 它们常用于将数据预处理等封装在类内,避免代码扩散到类外不好维护

    属性方法

    属性方法的作用就是通过@property把一个方法变成一个静态属性

    class Dog(object):
        name='suantou'
        def __init__(self,name):
            self.name=name
    
        @property  #把一个方法变成一个静态属性
        def eat(self):
            print('%s is eating %s'%(self.name,'something'))
    
        @eat.setter #为eat属性赋值
        def eat(self,food):
            print('set to food',food)
    
        def talk(self,something):
            print("%s is talking %s"%(self.name,something))
    
    d=Dog('Lulu')
    #d.eat('baozi')出错 说NoneType is not callable, 因为eat此时已经变成一个静态属性了, 不是方法了, 想调用已经不需要加()号了,直接d.eat就可以了
    d.eat
    
    d.eat='baozi'
    View Code

    实际场景应用:

    比如 ,你想知道一个航班当前的状态,是到达了、延迟了、取消了、还是已经飞走了, 想知道这种状态你必须经历以下几步:

    1. 连接航空公司API查询

    2. 对查询结果进行解析 

    3. 返回结果给你的用户

    因此这个status属性的值是一系列动作后才得到的结果,所以你每次调用时,其实它都要经过一系列的动作才返回你结果,但这些动作过程不需要用户关心, 用户只需要调用这个属性就可以了

    class Flight(object):
        def __init__(self, name):
            self.flight_name = name
    
        def checking_status(self):
            print("checking flight %s status " % self.flight_name)
            return 1
    
        @property
        def flight_status(self):
            status = self.checking_status()
            if status == 0:
                print("flight got canceled...")
            elif status == 1:
                print("flight is arrived...")
            elif status == 2:
                print("flight has departured already...")
            else:
                print("cannot confirm the flight status...,please check later")
    
        @flight_status.setter  # 修改
        def flight_status(self, status):
            status_dic = {
            0: "canceled",
            1:"arrived",
            2: "departured"
            }
            print("33[31;1mHas changed the flight status to 33[0m", status_dic.get(status))
    
        @flight_status.deleter  # 删除
        def flight_status(self):
            print("status got removed...")
    
    
    f = Flight("CA980")
    f.flight_status
    f.flight_status = 2  # 触发@flight_status.setter
    del f.flight_status  # 触发@flight_status.deleter
    View Code
  • 相关阅读:
    div的显示和隐藏
    asp.net使用My97 Date Picker时设置默认起始时间为n年之前的今天
    2的次幂表示【递归算法训练】
    怎样用JS获取ASP.NET服务器控件的客户端ID
    九度oj 题目1034:寻找大富翁
    CSS + DIV 让页脚始终保持在页面底部
    简单的鼠标可拖动div 兼容IE/FF
    web的各种前端打印方法之CSS控制网页打印样式
    CSS控制print打印样式
    专为控制打印设计的CSS样式
  • 原文地址:https://www.cnblogs.com/freely/p/6426692.html
Copyright © 2011-2022 走看看