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 #访问