python 新式类学习随笔-装饰器(3)
来源:互联网 发布:律所能源法业务知乎 编辑:程序博客网 时间:2024/06/02 04:48
@property
class Student(object): def __init__(self, name, age): self.name = name self.age = age @property #引用装饰器property def age(self): return self.__age @age.setter #函数修饰后可以作为装饰器使用调用后可以修改原始数据 def age(self,value): if not isinstance(value, int): raise ValueError('score must be an integer!') #非int类型抛异常 if value < 0 or value > 100: raise ValueError('score must between 0 ~ 100!') #年龄基本都是0-100以内,限制输入 self.__age = values = Student('Mitsui', 24) #当age参数传入24,age会去找被property修饰的age 实际上age = self.__age而非self.ageprint(s.name,s.age) #也就是age参数会传入age()方法中的value参数,开始执行age.setter,实现规范输入的目的,s.age = 18 #同时在调用时,把 age()方法变成一个可以赋值的属性,让调用者更加方便的调用s.name = 'BOBO'print(s.name)print(s.age) #没有赋值实际上执行了age方法下的 ‘return self.__age’
注意了:s.age 调用类内函数 实例 . 函数名 没有括号
类内部普通的方法,都是以self作为第一个参数,代表着通过实例调用时,将实例的作用域传入方法内;
@classmethod以cls作为第一个参数,代表将类本身的作用域传入。无论通过类来调用,还是通过类的实例调用,默认传入的第一个参数都将是类本身
@staticmethod不需要传入默认参数,类似于一个普通的函数
class Date(object): def __init__(self, year=0, month=0, day=0): self.year = year self.month = month self.day = day @property def time(self): return "{year}-{month}-{day}".format( year=self.year, month=self.month, day=self.day ) @classmethod def from_string(cls, string):year, month, day = map(str, string.split('-')) # 在 classmethod 内可以通过 cls 来调用到类的方法,甚至创建实例date = cls(year, month, day)return date @staticmethod def is_month_validate(month): return int(month) <= 12 and int(month) >= 1
@property
获取传入的时间,用date.time输出(注意没有括号)
>>> date = Date('2017','11','04')>>> date.time'2017-11-04'
@classmethod
此时就可以利用@classmethod,在类的内部新建一个格式化字符串,并返回类的实例的方法:
这样,我们就可以通过Date类来调用from_string方法创建实例,并且不侵略、修改旧的实例化方式:
>>> date = Date.from_string('2017-11-04')>>> date.time'2017-11-04'>>> date_old = Date('2017','11','04')>>> date.time'2017-11-04'
好处:
在@classmethod内,可以通过cls参数,获取到跟外部调用类时一样的便利
可以在其中进一步封装该方法,提高复用性
更加符合面向对象的编程方式
@staticmethod
而@staticmethod,因为其本身类似于普通的函数,所以可以把和这个类相关的 helper 方法作为@staticmethod,放在类里,然后直接通过类来调用这个方法。(不需要制定实例,date = Date())
>>> Date.is_month_validate(22)False>>> Date.is_month_validate(3)True
点击打开链接
类内部普通的方法,都是以self作为第一个参数,代表着通过实例调用时,将实例的作用域传入方法内;
@classmethod以cls作为第一个参数,代表将类本身的作用域传入。无论通过类来调用,还是通过类的实例调用,默认传入的第一个参数都将是类本身
@staticmethod不需要传入默认参数,类似于一个普通的函数
阅读全文
0 0
- python 新式类学习随笔-装饰器(3)
- python 新式类学习随笔-定制类的特殊方法(1)
- python 新式类的学习随笔-定制类的特殊方法(2)
- Python学习笔记——新式类
- python多继承(新式类)一
- python多继承(新式类)一
- python 多继承(新式类) 二
- python 多继承(新式类) 三
- 学习随笔(1)ObjectInputStream与ObjectOutputStream装饰器
- Python之旧式类、新式类(关键词:Python/旧式类/经典类/新式类)
- Python装饰器学习
- Python装饰器学习
- Python装饰器学习
- Python装饰器学习
- python 装饰器学习
- Python装饰器学习
- python 装饰器学习
- Python装饰器学习
- Qt视图场景框架之仿射变换
- python dlib学习(六):训练模型
- git常用命令
- refusing to merge unrelated histories(AS项目推送至码云出错)
- 计算轮廓点的最小凸包像素面积,最小外接圆的快速方法
- python 新式类学习随笔-装饰器(3)
- javaweb后端基础错题总结
- selenium脚本录制
- ideallij调试spark源码的n中方法
- spring一个项目调用另一个项目接口的方法,HttpClient调用
- react-native 屏幕尺寸和文字大小适配
- Kaldi知识点汇集
- android bug:Camera is being used after Camera.release() was called
- jvm学习笔记