一、类方法

  • 类方法定义:

    • 类方法:是由类来调用的方法,不是普通的构造方法,类方法约定俗称第一个参数是cls
      表示的是class,python把class的命名空间(内存地址)传递给类方法 ```python class A(object): def func(self):
      1. print(self)

    a1 = A() a1.func()

方法打印self,结果是本类在电脑中的内存地址,这种是普通的构造方法

class B(object): @classmethod

  1. # 添加类方法的装饰器
  2. def func(cls):
  3. # 参数固定是cls,表示的是class
  4. print(cls)

b1 = B() b1.func() B.func() ‘’’ 类方法:由类来调用的方法,不是由实例对象调用的方法。类方法需要在构造方法 上添加@classmethod装饰器,并且类方法的第一个参数约定俗成为cls。实际上是 python把类的命名空间(内存地址)传递给类方法 ‘’’

  1. - 把普通的构造方法转变成类方法需要在构造方法上添加@classmethod装饰器
  2. - 类方法不需要对象参与,当需要对类中的静态方法改变的时候需要用到类方法,用cls调用,不用类名
  3. > **Note**
  4. > 需要注意的是,普通方法是不推荐直接用类名直接调用类中的方法的,正常情况下都是实例化对象调用,但是如果使用了类方法装饰器
  5. > 把普通的方法转变成类方法后,则可以直接使用类名.方法名来调用。参数cls等同与本类,可以直接使用cls调用方法和静态字段,可
  6. > 以在类方法中修改静态字段,但是调用的类中的方法只能输出到对应的内存地址,不能获取到返回值。
  7. ```python
  8. '''实例一'''
  9. class B(object):
  10. name = 'alex'
  11. __age = 100
  12. count = 1
  13. @classmethod
  14. # 添加类方法的装饰器
  15. def func(cls):
  16. # 参数固定是cls,表示的是class
  17. cls.__age = cls.__age + 20
  18. return '%s的年龄为%s,第%s次返回' % (cls.name, cls.__age, cls.count + 1)
  19. # 这里可以直接使用cls来调用类中的变量、属性和方法
  20. b1 = B()
  21. b1.func()
  22. print(B.func())
  23. '''实例二'''
  24. class Person(object):
  25. __age = 100
  26. country = '中国'
  27. province = '北京'
  28. def __init__(self, name, height, weight):
  29. self.name = name
  30. self.height = height
  31. self.__weight = weight
  32. @property
  33. def bmi(self):
  34. bmi = self.__weight / self.height ** 2
  35. return bmi
  36. @bmi.setter
  37. def bmi(self, h1):
  38. self.height = h1
  39. # bmi = self.__weight / self.__height ** 2
  40. # return bmi
  41. @bmi.deleter
  42. def bmi(self):
  43. del self.height
  44. del self.__weight
  45. def get_name(self):
  46. return self.name
  47. @classmethod
  48. def message(cls, province):
  49. cls.province = province
  50. return cls.__age, cls.province, cls.country, cls.bmi, cls.get_name
  51. # 类方法中的第一个参数是cls,后边是其他的参数,和普通的方法用法基本一致。
  52. # 类方法只能通过cls来调用和修改类中的静态字段,不能调用属性,也可以调用类中的方法
  53. # 但是/输出的结果是方法的内存地址,如果是伪造属性,输出的是属性的内存地址
  54. p1 = Person('刘洋', 1.7, 95)
  55. print(p1.bmi)
  56. p1.height = 2.23
  57. print(p1.bmi)
  58. print(Person.message('河南'))
  1. - <font color='red'>类的静态方法可以被继承,可以直接使用子类调用父类中的静态方法</font>
  2. ```python
  3. class A(object):
  4. __country = '中国'
  5. province = '北京'
  6. def __init__(self, name, age, gender):
  7. self.name = name
  8. self.__age = age
  9. self.gender = gender
  10. @classmethod
  11. def func(cls):
  12. # cls:哪个类调用就显示哪个类的类空间
  13. return cls.__country, cls, cls.province
  14. class B(A):
  15. province = '河南'
  16. print(B.func())
  17. # B类继承自A类,那么B类也就继承类A类中的类方法,类方法中的cls此时表示的就是B类,输出B类的内存地址
  18. # 子类不能继承父类的私有方法、私有属性和私有类变量,其他的都可以继承
  • 实现子类调用父类方法从而调用子类中的静态字段的方式

    • 方式一:通过类方法,传递cls来实现调用
    • 方法二:通过普通方法,子类中没有,父类中有,通过self来调用

      ```python class A(object):

      1. __country = '中国'
      2. province = '北京'
      3. def __init__(self, name, age, gender):
      4. self.name = name
      5. self.__age = age
      6. self.gender = gender
      7. # 方式一
      8. @classmethod
      9. def func(cls, province):
      10. # cls:哪个类调用就显示哪个类的类空间
      11. cls.province = province
      12. # 类方法可以访问并修改类中的静态字段
      13. return cls.__country, cls, cls.province
      14. # 方式二
      15. def func1(self):
      16. print(self.province)
      17. self.province = '广东'
      18. print(self.province)
      19. # 普通方法也可以通过父类调用子类中的字段
      20. # 普通方法只能查询类中的静态字段
  1. class B(A):
  2. province = '河南'
  3. print(B.func('上海'))
  4. # B类继承自A类,那么B类也就继承类A类中的类方法,类方法中的cls此时表示的就是B类,输出B类的内存地址
  5. # 子类不能继承父类的私有方法、私有属性和私有类变量,其他的都可以继承
  6. b1 = B('里流', 12, '男')
  7. b1.func1()
  8. print(B.province)
  9. '''
  10. 结果是:上海、广东、上海
  11. '''
  12. ```
  13. > **Note**
  14. 需要注意的是:类方法和普通方法都可以实现父类方法调用子类静态字段的目的,但是区别在于:
  15. <font color='red'>类方法中可以直接修改子类中的静态字段值,而普通方法不能修改静态字段值</font>。

二、静态方法

  • 静态方法存在于类中,需要用到@staticmethod装饰器
  • 静态方法可以不传递任何的参数,也可以传递参数
  • 静态方法等同于在类中创建了一个单独的函数
  • 静态方法的好处

    • 代码块,清晰明了
    • 增加代码的复用性

      1. class C:
      2. __age = 100
      3. @staticmethod
      4. def login(username, password):
      5. if username == '李镇' and password == '12345':
      6. print('登陆成功')
      7. else:
      8. print('登陆失败')
      9. c1 = C()
      10. c1.login('李镇', '123456')
      11. # 输出结果:登陆失败

      ```