zoukankan      html  css  js  c++  java
  • 类中三个装饰器

    类中的三个装饰器

    装饰类中的方法

    • @classmethod --->装饰类方法,不用self属性,只用类的cls属性

    • @staticmethod --->装饰静态方法,既不用self属性,又不用类cls的属性

    • @property --->把一个方法伪装属性

    一、@classmethod

    在类中一个方法不用对象属性,但使用静态属性,那这个方法就是类方法,被classmethod装饰器装饰的方法,都有一个默认的参数cls,这个参数就是当前类!

    class A:
        __count = 0
        def __init__(self,name):
            self.name = name
            self.__add_count()  #只要执行init方法实例化对象就会产生调用 __add_count(),从而对静态属性__count操作
        @classmethod
        def __add_count(cls):  #私有方法
            cls.__count += 1  #让这个方法只能在内部被使用
        @classmethod #被classmethod装饰器装饰的方法,都有一个默认的参数,这个参数就是当前类
        def show_count(cls):
            return cls.__count
    
    print(A.show_count())   # 0 类调用show_count方法查看类的静态属性
    Sheldon = A('Sheldon')  # 实例化一个对象
    print(Sheldon.show_count()) # 1 对象调用show_count方法查看类的静态属性
    
    
    可以看出调用类方法,可以用对象调用,也可以使用类调用
    但是这个方法默认参数永远是当前类的命名空间,而不是对象的
    

    二、@staticmethod装饰器装饰静态方法

    如果一个类中的方法不使用对象属性也不使用静态属性 -- 静态方法,@staticmethod装饰的这个方法实际上这个方法就是一个普通函数.

    普通方法 类方法 静态方法
    默认参数 self cls
    操作的变量 操作对象属性 操作类属性 既不操作对象属性,也不操作类属性
    所属的命名空间
    调用方法 对象 类/对象 类/对象
    装饰器 @classmethod @staticmethod

    三.@property 把一个方法伪装成属性

    @name.setter 注意,setter 装饰的函数名叫什么,那么在这个函数中绝对不可以对这个函数名同名属性的修改

    @name.deleter 调用方方法进行删除属性

    示例1
    from math import pi
    class Circle:
        def __init__(self,r):
            self.r = r
    
        @property  # 把一个方法伪装成属性 
        def area(self):   # 被property装饰器装饰的方法不能传递除self以外的参数
            return pi*self.r**2
    
        @property
        def perimeter(self):
            return self.r*pi*2
    
    c1 = Circle(5)
    print(c1.area)
    c1.r = 10
    print(c1.area)   调用的时候不用加()
    
    class Person:
        def __init__(self,name):
            self.__name = name  # 不让外部随便修改
        @property
        def name(self):
            return self.__name
    
    Sheldon = Person('Sheldon')
    print(Sheldon.name) #这样写起到不容易被别人修改的作用
    
    property之setter和deleter
    
    class Person:
        def __init__(self,name,height,weight):
            self.__name=name
            self.__height=height
            self.__weight=weight
        @property
        def name(self):
            return '[我的名字是:%s]'%self.__name
        #用property装饰的方法名.setter
        @name.setter
        def name(self,new_name):
            # if not isinstance(new_name,str):
            if type(new_name) is not str:
                raise Exception('改不了')
            if new_name.startswith('sb'):
                raise Exception('不能以sb开头')
            self.__name=new_name
    
        # 用property装饰的方法名.deleter
        @name.deleter
        def name(self):
            # raise Exception('不能删')
            print('删除成功')
            # del self.__name
    
    p=Person('lqz',1.82,70)
    # print(p.name)
    # p.name='pppp'
    # p.name='xxx'
    #改不了,直接抛一异常
    # p.name=999
    # p.name='sb_nick'
    
    # print(p.name)
    
    del p.name
    print(p.name)
    
  • 相关阅读:
    本地blast用法
    linux挂载移动硬盘
    酶设计软件rosetta安装
    redhat 6.7 安装nvidia显卡驱动时出现的问题
    分子模拟软件Schrodinger Suites 2015安装
    Python_二维数组
    Python_递归
    Python_装饰器
    Python_生成器generator
    Python_迭代器
  • 原文地址:https://www.cnblogs.com/SkyOceanchen/p/11444589.html
Copyright © 2011-2022 走看看