一.属性
定义:将一个方法 伪装成一个 属性,在代码的级别上没有本质的提升,但是让其看起来跟合理.
class Person: def __init__(self,name,hight,weight): self.name = name self.__hight = hight self.__weight = weight @property def bmi(self): return '%s 的bmi 值%s' %(self.name,self.__weight / self.__hight ** 2) p1 = Person('大阳哥',1.68,70) print(p1.bmi)
总结:通过 @property bmi伪装成Person 的一个属性,可以进行 改动
属性的改, 删除 class Person: def __init__(self,name,age): self.name = name if type(age) is int: self.__age = age else: print( '你输入的年龄的类型有误,请输入数字') @property def age(self): return self.__age @age.setter def age(self,a1): '''判断,你修改的年龄必须是数字''' if type(a1) is int: self.__age = a1 else: print('你输入的年龄的类型有误,请输入数字') @age.deleter def age(self): del self.__age p1 = Person('帅哥',20) print(p1.age) print(p1.__dict__) p1.age = 23 print(p1.age) del p1.age
二. 类方法:
定义:通过类名调用的方法,类方法中第一个参数约定俗称cls,python自动将类名(类空间)传给cls.
class A: def func(self): # 普通方法 print(self) @classmethod # 类方法 def func1(cls): print(cls) a1 = A() A.func1() a1.func1() # 对象调用类方法,cls 得到的是类本身. a1.func() #得到A类空间的内存地址 A.func(11) #喝函数调用一样,现在是在类中,必须加A.传值
类方法的应用场景:
1, 类中 有些方法是不需要对象参与.
class A: name = 'alex' count = 1 @classmethod def func1(cls): # 此方法无需对象参与 return cls.name + str(cls.count + 1) print(A.func1()) #不可取 print(A.func1()) 结果: alex2 alex2
2, 对类中的静态变量进行改变,要用类方法. 通过cls. 更改
class A: count = 12 name = 'alex' @classmethod def func1(cls): cls.age = '000' class B(A): age = 22 print(B.__dict__) 结果为: {'__module__': '__main__', '__doc__': None, 'age': 22}
3,继承中,父类得到子类的类空间.
class A: age = 12 def func2(self): print(self) # self 子类的对象,能得到子类 空间的任意值 class B(A): age = 22 b1 = B() b1.func2()
三.静态方法
class A: @staticmethod def login(username, password): if username == 'alex' and password == 123: print('登录成功') else: print('登录失败...') A.login('alex',1234)
为什么不用函数呢?
def login(username,password): if username == 'alex' and password == 123: print('登录成功') else: print('登录失败...') login('alex',1234)
总结:
1,代码块.清晰.
2,复用性.