Python@函数装饰器

python有三种函数装饰器@staticmethod、@classmethod 和 @property,分别是修饰静态方法,类方法,属性方法(把方法当做属性)

@staticmemod

静态方法调用无需创建对象,用s类访问(现在已经不能用实例对象访问了)。但是静态方法不能访问类的成员方法和变量。

 class Student(object):
    __num=0
    def __new__(self):
        Student.__num+=1
    @classmethod
    def getNum(cls):
        return cls.__num
    @property
    def score(self):
        return self.__score
    @score.setter
    def score(self,value):
        if not isinstance(value,(int,float)):
            raise ValueError('score must be int or float')
        self.__score=value
    @staticmethod
    def get_class_name():
        return 'Student'

@classmethod

类方法用于一些脱离单个实例的操作或这属性修改,类方法可以用classsmethod修饰。classmethod 修饰符对应的函数不需要实例化,不需要 self 参数,但第一个参数需要是表示自身类的 cls 参数,可以来调用类的属性,类的方法,实例化对象等。
同时,由于python中不能利用重载来实例化对象,可以用类方法重载来进行对象的创建。

 class Student(object):
    __num=0
    def __new__(self):
        Student.__num+=1
    @classmethod
    def getNum(cls):#cls代表的是类本身,self代表的是实例对象本身
        return cls.__num
    @property
    def score(self):
        return self.__score
    @score.setter
    def score(self,value):
        if not isinstance(value,(int,float)):
            raise ValueError('score must be int or float')
        self.__score=value

实例对象不能访问声明为类方法的方法

stu=Student()
print(Student.getNum())

其中
print(stu.getNum())是非法的。

@property

对于class中的属性,为了不被非法修改,可以利用__property的方法进行私有化,然后利用set()和get()方法进行设置和访问,但是这样过于繁琐。可以利用属性进行设置:

class Student(object):
    @property
    def score(self):
        return self.__score
    @score.setter
    def score(self,value):
        if not isinstance(value,(int,float)):
            raise ValueError('score must be int or float')
        self.__score=value

运行

stu=Student()
stu.score=1  #设置
stu.score   #访问

关于更详细的@装饰器

装饰器的用法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值