语法~Python面向对象——类

本文详细讲解了Python面向对象编程中的关键概念,包括类定义、成员方法、魔术方法(如__init__和__str__),以及封装、继承(单继承、多继承和复写)和类型注解。最后介绍了多态在继承中的应用。
摘要由CSDN通过智能技术生成

一、类的定义

1.定义类

class 类名称:
    类的属性
    
    类的行为
  • class:关键词,表示要定义类

  • 类的属性:即定义在类中的变量(成员变量)

  • 类的行为:即定义在类中的函数(成员方法)

  • 创建类对象的语法:对象 = 类名称()

class Student:
    name = None
    age = None

    def introduction(self):
        print(f"我的名字是{self.name},我的年龄是{self.age}")

2.成员方法的定义

  • self关键字是成员方法定义的时候,必须填写的。
  • 在方法内部,想要访问类的成员变量,必须使用self
  • self关键字,尽管在参数列表中,但是传参的时候可以忽略它。
def 方法名(self, 形参1,...):
    方法题

二、魔术方法

1.__init__构造方法

  • Python类可以使用:__init__()方法,称之为构造方法
  • 可以实现
    • 在创建类对象(构造类)的时候,会自动执行。
    • 在创建类对象(构造类)的时候,将传入参数自动传递给__init__方法使用。
class Student:
    name = None
    age = None

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

    def introduction(self):
        print(f"我的名字是{self.name},我的年龄是{self.age}")

s = Student("FeiLink", 18)
s.introduction()

2.__str__字符串方法

  • 通过__str__方法,控制类转换为字符串的行为
class Student:
    name = None
    age = None

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

    def __str__(self):
        return f"Student对象, name={self.name}, age={self.age}"

s = Student("FeiLink", 18)
print(s)

3.__lt__小于符号比较方法

  • 对两个对象进行比较
  • __gt__:大于
  • __le__:小于等于
  • __ge__:大于等于
class Student:
    name = None
    age = None

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

    def __lt__(self, other):
        return self.age < other.age

s_1 = Student("FeiLink", 18)
s_2 = Student("EuropeanSheik", 20)

print(s_1 < s_2)

4.__eq__比较运算符实现方法

  • 不实现__eq__方法,对象之间可以比较,但是是比较内存地址,也即是:不同对象==比较一定是False结果
  • 实现了__eq__方法,就可以按照自己的想法来决定2个对象是否相等了
class Student:
    name = None
    age = None

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

    def __eq__(self, other):
        return self.age == other.age

s_1 = Student("FeiLink", 18)
s_2 = Student("EuropeanSheik", 18)

print(s_1 == s_2)

三、封装

1.介绍

  • 封装表示的是,将现实世界事物的:
    • 属性
    • 行为
  • 封装到类中,描述为:
    • 成员变量
    • 成员方法

2.私有成员的定义

  • 私有成员变量:变量名以__开头(2个下划线)
  • 私有成员方法:方法名以__开头(2个下划线)
class Student:
    name = None
    age = None
    __sex = None

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

    def __exercise(self):
        print("开始锻炼")

3.私有成员的使用

  • 私有方法无法直接被类对象使用,但是可以被其它的成员使用。
  • 私有变量无法赋值,也无法获取值
class Student:
    name = None
    age = None
    __sex = None

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

    def __exercise(self):
        print("开始锻炼")

    def if_exercise(self):
        if self.__sex == '男':
            self.__exercise()
        else:
            print("不锻炼了")

s = Student("FeiLink", 18, '男')
s.if_exercise()

四、继承

1.介绍

  • 继承表示将从父类那里继承(复制)来成员变量和成员方法(不含私有)

2.单继承

class 类名(父类名):
    类内容体
class Teacher:
    pass

class MaleTeacher(Teacher):
    pass

3.多继承

  • 注意事项:
    • 多个父类中,如果有同名的成员,那么默认以继承顺序(从左到右)为优先级。
class 类名(父类1, 父类2...)
	类内容体
class Teacher:
    pass

class People:
    pass

class MaleTeacher(Teacher, People):
    pass

4.复写

  • 介绍:子类继承父类的成员属性和成员方法后,如果对其“不满意”,那么可以进行复写
  • 方法:在子类中重新定义同名的属性或方法即可。
class People:
    study = None

class Teacher(People):
    study = True
  • 一旦复写父类成员,那么类对象调用成员的时候,就会调用复写后的新成员,如果需要使用被复写的父类的成员,需要特殊的调用方式:
    • 方式一:调用父类成员
      • 使用成员变量:父类名.成员变量
      • 使用成员方法:父类名.成员方法(self)
    • 方式二:使用super()调用父类成员
      • 使用成员变量:super().成员变量
      • 使用成员方法:super().成员方法()
  • 注意:只能在子类内调用父类的同名成员。子类的类对象直接调用会调用子类复写的成员

五、类型注解

1.介绍

  • 主要功能:

    • 帮助第三方IDE工具(如PyCharm)对代码进行类型推断,协助做代码提示

    • 帮助开发者自身对变量进行类型注释

  • 支持:

    • 变量的类型注解
    • 函数(方法)形参列表和返回值的类型注解
  • 类型注解仅仅是提示性的,不是决定性的,不会报错

2.语法

  • 元组类型设置类型详细注解,需要将每一个元素都标记出来
  • 字典类型设置类型详细注解,需要2个类型,第一个是key第二个是value
变量: 类型
# 基础数据类型注解
name: str = "FeiLink"
age: int = 18
height: float = 185.7

# 类对象类型注解
class People:
    pass
peo: People = People()

# 基础容器类型注解
l: list = [1, 2, 3]
t: tuple = (1, 2, 3)
S: set = {1, 2, 3}
D: dict = {"name": "FeiLink"}
s: str = "FeiLink"

# 容器类型详细注解
lis: list[int] = [1, 2, 3]
tup: tuple[str, int, float] = ("FeiLink", 18, 185.7)
se: set[int] = {1, 2, 3}
dic: dict[str, int] = {"FeiLink": 18}
  • 也可以在注释中进行注解,格式:# type: 类型
name = "FeiLink"        # type: str
age = 18                # type: int
height = 185.7          # type: float

3.函数(方法)的类型注解——形参注解

def 函数方法名(形参名: 类型, 形参名: 类型):
    pass
def c_add(x: int, y: int):
    return x+y

print(c_add(1, 2))

4.函数(方法)类型注解——返回值注解

def 函数方法名(形参: 类型) -> 返回值类型:
    pass
def c_add(x: int, y: int) -> int:
    return x+y

print(c_add(4, 5))

5.Union类型

  • 介绍:使用Union[类型, ......, 类型]可以定义联合类型,表示几种类型任选一
  • Union联合类型注解,在变量注解、函数(方法)形参和返回值注解中,均可使用。
from typing import Union

dic: dict[str, Union[str, int]] = {"name":"FeiLink", 'age': 18}

print(dic)

六、多态

1.介绍

  • 多态,指的是:多种状态,即完成某个行为时,使用不同的对象会得到不同的状态。
  • 多态常作用在继承关系上.
  • 抽象类:含有抽象方法的类称之为抽象类
  • 抽象方法:方法体是空实现的(pass)称之为抽象方法

2.实例

class People:
    def feature(self):
        pass

class Man(People):
    def feature(self):
        return "身材魁梧"

class Woman(People):
    def feature(self):
        return "身材苗条"

def describe_feature(people: People):
    print(people.feature())

a = Man()
b = Woman()
describe_feature(a)
describe_feature(b)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值