美文网首页
2020-02-07

2020-02-07

作者: 数据小黑升值记 | 来源:发表于2020-02-07 15:52 被阅读0次

    @property

    功能:将方法转变为属性调用
    场景:为避免对类属性的直接访问和修改,使用此装饰器实现getter和setter方法,而不用在调用方法实现对属性的修改,可以直接使用属性设置,安全方便
    实例

    class Person(object):
        def __init__(self,name,age):
            self._name=name
            self._age=age
    
        @property #实现了一个关于age的getter方法
        def age(self):
            return self._age
    
        @age.setter #实现了关于age的setter方法,如果不设置此处,则age为只读属性
        def age(self,age):
            self._age=age
    
    
    
        def play(self):
            if self._age<=16:
                print('%s玩aa'%self._name)
            else:
                print('%s玩bb'%self._name)
    
    
    def main():
        person=Person('小明',12)
        person.play()
        person.age=22
        person.play()
    
    
    
    if __name__=='__main__':
        main()
    

    注意

    1. 属性名和方法名不能一样,否则死循环
    2. 定义方法的时候,@property必须在@xxx.setter之前,且修饰的方法名相同

    __slots__

    功能:限定当前类只能设置某些属性,但对子类不起作用

    实例方法

    常规类中定义的方法,需要先实例化后才可以调用,通常第一个参数指定为self,指该类的一个实例化对象

    chass Pizza(object):
    
        def __init__(self,size):
            self._size=size
        
        def get_size(self):
            return self.size
    

    静态方法

    • 可以理解是定义在类中的函数,与对象本身的状态无关,无需实例化即可调用,
    • 可以在子类中被覆盖
    • 使用@staticmethod装饰
    class Pizza(object):
        @staticmethod
        def mix_ingredients(x, y):
            return x + y
    
        def cook(self):
            return self.mix_ingredients(self.cheese, self.vegetables)
    

    类方法

    • 绑定在类对象上的方法
    • 可以调用静态方法,而不用硬编码类名
    • @classmethod
    class Pizza(object):
        def __init__(self, radius, height):
            self.radius = radius
            self.height = height
    
        @staticmethod
        def compute_area(radius):
             return math.pi * (radius ** 2)
    
        @classmethod
        def compute_volume(cls, height, radius):
             return height * cls.compute_area(radius)
    
        def get_volume(self):
            return self.compute_volume(self.height, self.radius)
    

    抽象方法

    • 定义类的类,只能被继承,不能实例化
    • 子类必须要有该方法,否则报错
    • 子类有此方法就可以,但并不能限定子类方法是类方法还是静态方法,即便在抽象类中使用了@classmethod
    import abc
    
    class BasePizza(object):
        __metaclass__  = abc.ABCMeta
    
        @abc.abstractmethod
        def get_radius(self):
             """Method that should do something."""
    

    相关文章

      网友评论

          本文标题:2020-02-07

          本文链接:https://www.haomeiwen.com/subject/ganmxhtx.html