property特殊属性/类方法/静态方法

时间:2022-11-02 16:09:01

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 提高复用性,继承有这个方法的类即可