【知识点】
1、属性:将一个方法 伪装成一个 属性,在代码的级别上没有本质的提升,但是然其看起来合理
@property
1 class Person: 2 def __init__(self,name,hight,weight): 3 self.name=name 4 self.__hight=hight 5 self.__weight=weight 6 7 @property #添加property实现bmi动词变名词 8 def bmi(self): 9 return "%s的bmi值%s" % (self.name,self.__weight/self.__hight**2) 10 11 p1=Person('大秧歌',1.68,70) 12 print(p1.bmi) # 不添加括号 13 # 在不添加property的情况下,实现方法的调用为p1.bmi(),而添加了@property后,实现方法的功能调用如上
2、属性的改(@属性名.setter)
# 对age输入进行类型判断,也实现私有属性的修改
3、属性的删:(@属性名.deleter) 在方法中添加del self.__age (很少用,了解)
4、类方法:(@classmethod)通过类名调用的方法,类方法中第一个参数约定俗称cls,python自动将类名(类空间)传给cls
应用场景:①类中 有些方法是不需要对象参与的
②对类中的静态变量进行改变
③继承中,父类得到子类的类空间
1 # 类方法 2 class A: 3 def func(self): #普通方法 4 print(self) 5 6 @classmethod #类方法 7 def func1(cls): 8 print(cls) 9 # a1=A() 10 # a1.func() # python自动传参 11 # A.func(a1) # 主动传参 12 A.func1() #<class '__main__.A'> 13 a1=A() 14 a1.func1() #<class '__main__.A'> #对象调用类方法,cls得到的是类本身
1 # 应用场景 2 # 类中 有些方法是不需要传入对象,不要对象的一切东西 3 class A: 4 name='abc' 5 count=1 6 7 def func(self): 8 return A.name+str(A.count+1) 9 # A.func(111) # 不可取 10 a1=A() 11 print(a1.func()) # 无需对象参与,但是又必须实例化一个的对象 12 13 14 15 # 使用类方法来改善这个情况 16 class A: 17 name='abc' 18 count=1 19 20 @classmethod 21 def func(cls): # cls就是类名 22 return cls.name+str(cls.count+1) 23 print(A.func()) #不像上面那样调用类方法需要传参
1 # 应用场景 2 # 继承中,父类得到子类的类空间 3 class A: 4 name='abc' 5 age=12 6 7 @classmethod 8 def func(cls): 9 # 若有B.func(),则此时可以对B的所有内容进行修改 10 cls.hight=20 # 修改B类中的静态比变量 11 class B(A): 12 hight=12 13 width=15 14 15 def f(self): 16 print('B') 17 B.func() 18 print(B.hight) # 20 已经被修改 19 #此方法,不仅能调用子类空间的任意值,还可以进行修改 20 #***************************************************** 21 class A: 22 name='abc' 23 age=12 24 25 def func1(self): 26 #通过B实例化对象b1.func1(),能得到子类 空间的任意值 27 print(self) 28 29 class B(A): 30 hight=12 31 width=15 32 33 def f(self): 34 print('B') 35 b1=B() 36 b1.func() 37 # 此方法只能调用子类空间的任意值,但是不能修改
5、静态方法:(@staticmethod)
1 # 静态方法 2 class A: 3 4 @staticmethod 5 def login(username,password): # 参数不固定,自由传参 6 if username=='123' and password==123: 7 print("登录成功") 8 else: 9 print("登录失败") 10 11 A.login('123',123) # 登录成功 12 # 为什么要在类中定义一个普通的函数? 13 #1,形成代码块:清晰 14 #2,复用性