property是将一个方法伪装成了一个属性,在代码层面看是没有本质提升的,
但是在代码写出来之后,在类外面看来就由执行一个动作变成了查询一个属性,是面向对象的一种体现
在对应的方法前加装饰器@property即可
此时再调用相关内容的时候,不用再方法名加括号,直接以属性的形式,调用属性(实际是方法)名查询即可....
以age为例
class Person: def __init__(self,name,age): self.name = name self.__age = age @property def age(self): return (self.__age) p1 = Person('帅哥',20) print(p1.age) p1.age = 18
这是满足了一个属性查的要求,伪装之后同样可删可改
class Person: def __init__(self,name,age): self.name = name self.__age = age @property def age(self): return self.__age @age.setter #修改 def age(self,a1): if type(a1) is int: #判断,修改的内容必须是数字 self.__age = a1 else: print('请输入数字') #三个age方法名必须一样,执行时,运行装饰器setter下面的代码,且把修改的值传给了self后面的参数a1 #所以把a1给真正要被修改的内容 @age.deleter #删除 def age(self): print(666) #同样执行deleter也是触发下面的代码语句,具体实现其功能需要根据具体需求设定 p1 = Person('帅哥',20) print(p1.age) p1.age = 18
类方法
在对应方法前加装饰器@classmethod,且括号内的默认self改为cls,python会自动将类名传到cls中,
谁真正从源头上调用的cls,就是传谁的类名(类空间),不一定是定义这个方法的类.比如,子类没有而找到了父类中的类方法,那么就是
#通过类名调用这个方法不需要传参,第一个参数约定俗成cls,python自动将类名(类空间)传给cls
#通过对象调用这个方法cls,python还是自动将类名(类空间)传给cls
#应用场景:
# 1.类中的有些方法是不需要传入对象的,不需要对象的任何东西.比如这个方法的内容只操作类的属性
# 2.对类中的静态变量进行改变
# 3.在继承中,父类得到子类的类空间,可对子类为所欲为...
静态方法
在对应方法前加装饰器@staticmethod,且括号内无默认self参数
看上去就是一个本就与类和对象都无关的函数
#单独类外的函数就可以同样功能,为什么要写在里面?
#因为:1 放在一个统一的代码块里,结构清晰
# 2 提高复用性,继承有这个方法的类即可