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

本文介绍了Python中的类定义、构造函数`__init__`、私有方法、继承、魔术方法(如`__str__`)、类型注解和多态性,展示了如何通过这些概念实现对象的结构和行为.

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

类 

  • 类的运用很常见:在大部分情况下,对一些特有的对象,可以使用特定的类来指向它:
class Person:
    name = 'unknown'
    age = -1
    sex = 0
    partner = None

    def __init__(self, name, age, sex, partner):
        self.name = name
        self.age = age
        self.sex = sex
        self.partner = partner

    def __log(self):
        print(self.name, self.age, self.sex, self.partner)

    def greet(self):
        print(f"hello, {self.name}")
        self.__log()


p1 = Person('Polaris', 18, 1, None)
p2 = Person('PolarisX', 19, 1, p1)
p2.partner.greet()
  • 上处代码是一个比较完整的定义和实现
  • __init__方法是实例化方法,其中self是python关键字,用于指向Person类实例,类似JS中的this
  • __log方法是一个私有方法,通过双下划线定义私有方法和私有变量,当然也可以通过单下划线定义保护成员和保护方法,具体如下:
class Person:
    _id = -1
    name = 'unknown'
    age = -1
    sex = 0
    partner = None

    def __init__(self, name, age, sex, partner):
        self._id = random.randint(0, 10000)
        self.name = name
        self.age = age
        self.sex = sex
        self.partner = partner

    def __log(self):
        print(self.name, self.age, self.sex, self.partner)

    def greet(self):
        print(f"hello, {self.name}")
        self.__log()

    def _getID(self):
        return self._id


class Teacher(Person):
    __tid = -1

    def __init__(self, name, age, sex, partner):
        super().__init__(name, age, sex, partner)
        self.__tid = random.randint(0, 10000)
        # 打印ID和TID
        print(super()._getID(), self.__tid)


class Driver(Person):
    __did = -1

    def __init__(self, name, age, sex, partner):
        super().__init__(name, age, sex, partner)
        self.__did = random.randint(0, 10000)
        # 打印ID和TID
        print(super()._getID(), self.__did)


t1 = Teacher('Polaris', 18, 1, None)
d1 = Driver('PolarisX', 20, 1, None)
  • 很显然私有方法和保护方法,均无法使用,但保护方法可以通过继承给子类使用
  • 继承类可以是多个,使用逗号隔开,优先会使用第一继承位的方法和成员,以防止继承多个类时的冲突
魔术方法

  • python内置了许多魔术方法,先说说str魔术方法 
class Teacher(Person):
    __tid = -1

    def __init__(self, name, age, sex, partner):
        super().__init__(name, age, sex, partner)
        self.__tid = random.randint(0, 10000)
        # 打印ID和TID
        # print(super()._getID(), self.__tid)

    def __str__(self):
        return f"Teacher(name={self.name}, age={self.age}, sex={self.sex}, partner={self.partner})"



print(Person('Polaris', 18, 1, None))
print(Teacher('Polaris', 18, 1, None))


>>> <__main__.Person object at 0x10291f050>
>>> Teacher(name=Polaris, age=18, sex=1, partner=None)
  •  上面的代码返回的结果是不一样的,如果我们不设置str魔术方法,返回的是对象的内存地址,而我们定义了方法后,则会按照我们定义的格式返回
  • 下面我们在说说重构类比较符,具体如下:
    # 重定义小于
    def __lt__(self, other):
        return self.age < other.age

    # 重定义等于
    def __eq__(self, other):
        return self.age == other.age

    # 重定义小于等于
    def __le__(self, other):
        return self.age <= other.age


    t1 = Teacher('Polaris', 22, 1, None)
    t2 = Teacher('PolarisX', 22, 1, None)
    print(t1 > t2)
    print(t1 == t2)
    print(t1 <= t2)



>>> False
>>> True
>>> True
  • 上处代码,对比较符号进行了重构
类方法的复写

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

class Phone2(Phone):

    def call_by_5g(self):
        if super()._check_5g():
            print('phone2 call by 5g')
        else:
            print('phone2 call by 4g')    



phone2 = Phone2(True)
phone2.call_by_5g()



>>> phone2 call by 5g
  • 上述代码中,对call_by_5g实现了复写
类型注解

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

    num1: int = 1
    num2: float = 1.2
    str1: str = 'hello'
    bool1: bool = True
    list1: list[int, float] = [1, 2, 3]
    tuple1: tuple[int, bool] = (1, True)
    dict1: dict[str, int | str | bool] = {'name': 1, 'age': 18, 'tel': '123456789X', 'is_married': True}
    set1: set[int] = {1, 2, 3}

    num3 = 1  # type: int
    num4 = 1.2  # type: float
    str2 = 'hello'  # type: str
    bool2 = True  # type: bool
    list2 = [1, 2, 3]  # type: list[int, float]
    tuple2 = (1, True)  # type: tuple[int, bool]
    dict2 = {'name': 1, 'age': 18, 'tel': '123456789X', 'is_married': True}  # type: dict[str, int | str | bool]
    set2 = {1, 2, 3}  # type: set[int]

    p1 = Person('Pole', 18, '123456789X', True)  # type: Person
  • python对类型实现两种注解方式,第一种‘:’注解,第二种注释注解
  • 即使用户不按照类型注解来传递值,也不会报错,但不推荐虚假注解
from typing import Union    

dict3: dict[str, Union[bool, str]] = {'name': 'p1'}
  • 有些时候我们可能会有多个类型变量,此时使用Union可以很好的解决联合类型的问题
多态
class Person:

    def speak(self):
        pass


class Teacher(Person):

    def speak(self):
        print('Teacher speak')


class Driver(Person):

    def speak(self):
        print('Driver speak')


def speakSth(p: Person):
    p.speak()


    p1 = Person()
    t1 = Teacher()
    d1 = Driver()

    speakSth(p1)
    speakSth(t1)
    speakSth(d1)



>>> Teacher speak
>>> Driver speak
  • 上述代码是一个简单的多态应用,常用于继承方法的不同实现
  • 其中一个类中的方法无具体实现,则这就是抽象类

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

言行物恒

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值