• Python学习笔记——类、魔术方法


    • 食用说明:本笔记适用于有一定编程基础的伙伴们。希望有助于各位! 

    类 

    • 类的运用很常见:在大部分情况下,对一些特有的对象,可以使用特定的类来指向它:
    1. class Person:
    2. name = 'unknown'
    3. age = -1
    4. sex = 0
    5. partner = None
    6. def __init__(self, name, age, sex, partner):
    7. self.name = name
    8. self.age = age
    9. self.sex = sex
    10. self.partner = partner
    11. def __log(self):
    12. print(self.name, self.age, self.sex, self.partner)
    13. def greet(self):
    14. print(f"hello, {self.name}")
    15. self.__log()
    16. p1 = Person('Polaris', 18, 1, None)
    17. p2 = Person('PolarisX', 19, 1, p1)
    18. p2.partner.greet()
    • 上处代码是一个比较完整的定义和实现
    • __init__方法是实例化方法,其中self是python关键字,用于指向Person类实例,类似JS中的this
    • __log方法是一个私有方法,通过双下划线定义私有方法和私有变量,当然也可以通过单下划线定义保护成员和保护方法,具体如下:
    1. class Person:
    2. _id = -1
    3. name = 'unknown'
    4. age = -1
    5. sex = 0
    6. partner = None
    7. def __init__(self, name, age, sex, partner):
    8. self._id = random.randint(0, 10000)
    9. self.name = name
    10. self.age = age
    11. self.sex = sex
    12. self.partner = partner
    13. def __log(self):
    14. print(self.name, self.age, self.sex, self.partner)
    15. def greet(self):
    16. print(f"hello, {self.name}")
    17. self.__log()
    18. def _getID(self):
    19. return self._id
    20. class Teacher(Person):
    21. __tid = -1
    22. def __init__(self, name, age, sex, partner):
    23. super().__init__(name, age, sex, partner)
    24. self.__tid = random.randint(0, 10000)
    25. # 打印ID和TID
    26. print(super()._getID(), self.__tid)
    27. class Driver(Person):
    28. __did = -1
    29. def __init__(self, name, age, sex, partner):
    30. super().__init__(name, age, sex, partner)
    31. self.__did = random.randint(0, 10000)
    32. # 打印ID和TID
    33. print(super()._getID(), self.__did)
    34. t1 = Teacher('Polaris', 18, 1, None)
    35. d1 = Driver('PolarisX', 20, 1, None)
    • 很显然私有方法和保护方法,均无法使用,但保护方法可以通过继承给子类使用
    • 继承类可以是多个,使用逗号隔开,优先会使用第一继承位的方法和成员,以防止继承多个类时的冲突
    魔术方法

    • python内置了许多魔术方法,先说说str魔术方法 
    1. class Teacher(Person):
    2. __tid = -1
    3. def __init__(self, name, age, sex, partner):
    4. super().__init__(name, age, sex, partner)
    5. self.__tid = random.randint(0, 10000)
    6. # 打印ID和TID
    7. # print(super()._getID(), self.__tid)
    8. def __str__(self):
    9. return f"Teacher(name={self.name}, age={self.age}, sex={self.sex}, partner={self.partner})"
    10. print(Person('Polaris', 18, 1, None))
    11. print(Teacher('Polaris', 18, 1, None))
    12. >>> <__main__.Person object at 0x10291f050>
    13. >>> Teacher(name=Polaris, age=18, sex=1, partner=None)
    •  上面的代码返回的结果是不一样的,如果我们不设置str魔术方法,返回的是对象的内存地址,而我们定义了方法后,则会按照我们定义的格式返回
    • 下面我们在说说重构类比较符,具体如下:
    1. # 重定义小于
    2. def __lt__(self, other):
    3. return self.age < other.age
    4. # 重定义等于
    5. def __eq__(self, other):
    6. return self.age == other.age
    7. # 重定义小于等于
    8. def __le__(self, other):
    9. return self.age <= other.age
    10. t1 = Teacher('Polaris', 22, 1, None)
    11. t2 = Teacher('PolarisX', 22, 1, None)
    12. print(t1 > t2)
    13. print(t1 == t2)
    14. print(t1 <= t2)
    15. >>> False
    16. >>> True
    17. >>> True
    • 上处代码,对比较符号进行了重构
    类方法的复写

    有些情况下,类的方法可能继承自父类,但父类的方法又不能满足新类的需求,我们可以实现复写:

    1. class Phone2(Phone):
    2. def call_by_5g(self):
    3. if super()._check_5g():
    4. print('phone2 call by 5g')
    5. else:
    6. print('phone2 call by 4g')
    7. phone2 = Phone2(True)
    8. phone2.call_by_5g()
    9. >>> phone2 call by 5g
    • 上述代码中,对call_by_5g实现了复写
    类型注解

    类型注解和TS的类似,具体如下:

    1. num1: int = 1
    2. num2: float = 1.2
    3. str1: str = 'hello'
    4. bool1: bool = True
    5. list1: list[int, float] = [1, 2, 3]
    6. tuple1: tuple[int, bool] = (1, True)
    7. dict1: dict[str, int | str | bool] = {'name': 1, 'age': 18, 'tel': '123456789X', 'is_married': True}
    8. set1: set[int] = {1, 2, 3}
    9. num3 = 1 # type: int
    10. num4 = 1.2 # type: float
    11. str2 = 'hello' # type: str
    12. bool2 = True # type: bool
    13. list2 = [1, 2, 3] # type: list[int, float]
    14. tuple2 = (1, True) # type: tuple[int, bool]
    15. dict2 = {'name': 1, 'age': 18, 'tel': '123456789X', 'is_married': True} # type: dict[str, int | str | bool]
    16. set2 = {1, 2, 3} # type: set[int]
    17. p1 = Person('Pole', 18, '123456789X', True) # type: Person
    • python对类型实现两种注解方式,第一种‘:’注解,第二种注释注解
    • 即使用户不按照类型注解来传递值,也不会报错,但不推荐虚假注解
    1. from typing import Union
    2. dict3: dict[str, Union[bool, str]] = {'name': 'p1'}
    • 有些时候我们可能会有多个类型变量,此时使用Union可以很好的解决联合类型的问题
    多态
    1. class Person:
    2. def speak(self):
    3. pass
    4. class Teacher(Person):
    5. def speak(self):
    6. print('Teacher speak')
    7. class Driver(Person):
    8. def speak(self):
    9. print('Driver speak')
    10. def speakSth(p: Person):
    11. p.speak()
    12. p1 = Person()
    13. t1 = Teacher()
    14. d1 = Driver()
    15. speakSth(p1)
    16. speakSth(t1)
    17. speakSth(d1)
    18. >>> Teacher speak
    19. >>> Driver speak
    • 上述代码是一个简单的多态应用,常用于继承方法的不同实现
    • 其中一个类中的方法无具体实现,则这就是抽象类

  • 相关阅读:
    第三章-存储系统-Cache和页式存储、虚拟存储
    Learn Prompt- Midjourney 图片生成:基本设置和预设
    Maya自定义工具架
    MongoDB之MongoDBConnectorBI安装与使用
    hgame week3 WEB和MISC全wp
    c语言练习70:反转两次的数字
    Java SE 12 新增特性
    Mac系列之:Mac安装tesseract和python使用pytesseract、pillow包提取图片中中文
    基于simulink的风力机房温度控制系统仿真
    小白学习笔记—网络安全/黑客技术
  • 原文地址:https://blog.csdn.net/HAC_SOUL/article/details/133938779