python学习Day20--属性、类方法和静态方法+类多继承算法补充

【知识点】

 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,复用性

 【类多继承C3算法补充】

原文地址:https://www.cnblogs.com/fengxb1213/p/12304605.html