zoukankan      html  css  js  c++  java
  • python三个自带装饰器的功能与使用(@property、@staticmethod、@classmethod)

    本篇随笔只是记录我对这三个装饰器的理解,可能会有不准确的地方,敬请指出。

    property装饰器

    功能:通过property装饰器控制类的属性的绑定与获取,一般就是给某个属性增加一个验证类型等功能。

      能够通过实例直接点出属性值来,更加方便快捷,如例三中student.age:

    例一:

    错误效果:

    class Student(object):
        age = 20
    student = Student()
    print(student.age)  #打印结果为20
    student.age="二十"  #不应该绑定为字符串的属性
    

     为了避免如上行为,将代码更改为:

    例二:

    class Student(object):
        def __init__(self):
            self._age = None
    
        def age_getter(self):   #返回属性值
            return self._age
    
        def age_setter(self, age):  #设置属性值
            if isinstance(age, str) and age.isdigit():   #验证绑定属性的类型
                age = int(age)   
            if isinstance(age, int):
                self._age = age
            else:
                raise ValueError("age is illegal")  #如果不能转换类型则抛出错误
    
    student=Student()
    student.age_setter("5")  #绑定属性为字符串5
    print(student.age_getter())   打印结果为5,Int格式
    

     上述代码解决了属性绑定类型错误的问题,但是不够方便,Python自带的property装饰器能够帮助修饰代码,如下:

    例三:

    class Student(object):
        def __init__(self):
            self._age = None
        @property  #装饰age函数,可以直接将age函数作为属性,直接通过等号绑定属性值
        def age(self):
            return self._age
        @age.setter #通过setter设置age的属性,函数内部写验证规则
        def age(self,age):
            if isinstance(age,int):
                self._age =age
                return
            if isinstance(age,str) and age.isdigit():
                age = int(age)
                self._age = age
            else:
                raise ValueError("age is illegal")
        @age.deleter  #deleter是删除属性方法
        def age(self):
            del self._age
    student =Student()
    student.age = "20"
    print(student.age)
    
    # del student.age
    # print(student.age)
    

     staticmethod装饰器

    功能:将被装饰的函数从类中分离出来,该函数不能访问类的属性,简单说可以将该函数理解为一个独立的函数,不允许使用self。

    
    

     staticmethod 就是将该被装饰的函数与该类没有关系,该函数不能用self传参,需要和普通函数一样传参。

    作用:
    限制名称空间,这个函数虽然是个普通的函数,但只有这个类里能用到
    代码易读性.静态方法并不需要self参数
    约内存.不用每个实例都实例化方法.
    在类内部控制静态方法.不然的话换一种实现方法,把函数放在在类外部

    例四:

    class Dog(object):
        def __init__(self,name):
            self.name = name
        @staticmethod
        def eat(name,food):
            print("%s is eating %s" %(name,food))
    d = Dog("tom")
    d.eat("tom","包子")
    #通过对象调用方法
    Dog.eat("jerry","面条")
    #通过类调用方法
    

    classmethod装饰器,类装饰器

    例五:

    class Dog(object):
        name="Jerry"
        def __init__(self,name):
            self.name = name
        @classmethod
        def eat(self):
            print("%s is eating %s" %(self.name,"food"))
        def talk(self):
            print("%s is talking" % self.name)
    d = Dog("Tom")
    d.eat()
    Dog.eat()
    

     工厂模式的一个方法
    class
    method可以用来为一个类创建一些预处理的实例.
    类方法只能找类变量,不能访问实例变量,
    所以这里的name是jerry而不是实例化的tom

     
  • 相关阅读:
    Java HashMap的原理、扩容机制、以及性能
    Istanbul BFT共识算法解读
    golang中slice的扩容机制
    Use the "Enclave Signing Tool" to sign enclave files
    以太坊椭圆曲线Specp256k1通过消息的hash和签名(对消息的hash的签名)来恢复出公钥和计算r值
    Intel SGX SDK toolkits
    Intel SGX Edger8r
    Intel SGX C++ library
    SGX Makefile学习笔记
    在ubuntu中安装gem5
  • 原文地址:https://www.cnblogs.com/ArmoredTitan/p/8550892.html
Copyright © 2011-2022 走看看