[Python] Class 类

1. 对象

class Student:  # 1.设计类
    name = None
    gender = None
    nationality = None
    native_place = None
    age = None


# 2.基于类创建对象
stu_1 = Student()
stu_2 = Student()

stu_1.name = '周华'  # 3.为学生1对象赋予名称属性值
stu_1.age = 15
stu_2.name = '李明'

# 4.获取对象中记录的信息
print(stu_1.age)

2. 类的成员方法 

class Student:  # 1.设计类
    name = None
    gender = None
    nationality = None
    native_place = None
    age = None

    def say_hi(self):
        print(f"大家好,我是{self.name}")

    def say_hi2(self, msg):
        print(f"大家好,我是:{self.name},{msg}")


# 2.基于类创建对象-
stu_1 = Student()
stu_2 = Student()

stu_1.name = '周华'  # 3.为学生1对象赋予名称属性值
stu_1.age = 15
stu_2.name = '李明'

# 4.获取对象中记录的信息
print(stu_1.age)

stu_1.say_hi()
stu_2.say_hi2("你吃了吗")

1. 类的组成

  • 类的属性:成员变量
  • 类的行为:成员方法

attention:函数是写在类外的,方法则是定义在类内部

2. 类和成员方法的定义语法

class 类名称:
    成员变量

    def 成员方法(self, 参数列表):
        成员方法体

对象 = 类名称()

3. self的作用

  • 表示类对象本身的意思
  • 只有通过self,成员方法才能访问类的成员变量
  • self出现在形参列表中,但不占用参数位置

3. 类和对象

"""
类和对象的关系,即面向对象的编程思想
"""
import winsound


# 设计一个闹钟类
class Clock:
    id = None  # 序列化
    price = None  # 价格

    def ring(self):
        winsound.Beep(2000, 3000)


# 构建两个闹钟对象并让其工作
clock1 = Clock()
clock1.id = "00019"
clock1.price = 19.9
print(f"闹钟ID:{clock1.id},价格:{clock1.price}")
clock1.ring()

clock2 = Clock()
clock2.id = "00020"
clock2.price = 29.9
print(f"闹钟ID:{clock2.id},价格:{clock2.price}")
clock2.ring()

1. 现实世界的事物由属性行为组成。也可以包含属性和行为。

2. 类和对象的关系

  • 类是程序中的“设计图纸”
  • 对象是基于图纸生产的具体实体

3. 面向对象编程

即使用对象进行编程:设计类,基于类创建对象,并使用对象来完成具体的工作

4. 构造方法

Python类可以使用:__init__()方法,称之为构造方法。

可以实现:

  • 在创建类对象(构造类)的时候,会自动执行。
  • 在创建类对象(构造类)的时候,将传入参数自动传递给__init__方法使用。
"""
类的构造方法:__init__
"""


class Student:
    name = None    # 可省略
    age = None
    tel = None

    def __init__(self, name, age, tel):
        self.name = name    # 即可赋值,又能定义
        self.age = age
        self.tel = tel
        print("Student类创建了一个类对象")


stu = Student("李华", 18, 15859643320)
print(stu.name)

attention:

  • 构造方法也是成员方法,需要在参数列表中提供:self
  • 在构造方法内定义成员变量,需要使用self关键字。因为变量是定义在构造方法内部。如果要成为成员变量,需要用self表示。

5. 类的内置函数

"""
类的内置方法
"""


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

    def __str__(self):
        '''
        控制类转换为字符串的行为
        :return: 字符串
        '''
        return f"Student类对象,name:{self.name},age:{self.age}"

    def __lt__(self, other):
        """
        小于符号比较方法
        :param other: 另一个类对象
        :return: True/False
        """
        return self.age < other.age

    def __le__(self, other):
        """
        小于等于符号比较方法  <= , >=
        :param other: 另一个类对象
        :return: True/False
        """
        return self.age <= other.age

    def __eq__(self, other):
        """
        等于符号比较方法  <= , >=
        :param other: 另一个类对象
        :return: True/False
        """
        return self.age == other.age


stu1 = Student("李华", 18)
print(stu1)
print(str(stu1))

stu2 = Student("林杰", 22)
print(stu1 < stu2)
print(stu1 > stu2)

print(stu1 <= stu2)
print(stu1 >= stu2)

stu1 = Student("李华", 18)
stu2 = Student("林杰", 18)
print(stu1 == stu2)
方法功能
__init__构造方法,可用于创建类对象的时候设置初始化行为
__str__用于实现类对象转字符串的行为
__lt__用于两个类对象进行小于或大于比较
__le__用于两个类对象进行小于等于或大于等于比较
__eq__用于两个类对象进行相等比较

6. 封装

"""
封装,包含私有成员变量和私有成员方法
"""


# 定义一个类,内含私有成员变量和私有成员方法
class Phone:
    __current_voltag = 0.2  # 手机运行电压

    def __keep_single_core(self):
        print("让CPU以单核模式运行。")

    def call_by_5g(self):
        if self.__current_voltag >= 1:
            print("5g通话已开启。")
        else:
            self.__keep_single_core()
            print("电量不足,无法使用,开启省电模式。")


phone = Phone()
# phone.__keep_single_core()  # AttributeError: 'Phone' object has no attribute '__keep_single_core'
# print(phone.__current_voltag)  # AttributeError: 'Phone' object has no attribute '__current_voltag'
phone.call_by_5g()

1. 封装:将现实世界事物在类中描述为属性和方法。

2. 现实事物有部分属性和行为是不公开对使用者开放的。同样在类中描述属性和方法的时候也需要达到这个要求,所以需要定义私有成员。

3. 定义私有成员:成员变量和成员方法的命名均以__作为开头即可。

4. 私有成员的访问限制:

  • 类对象无法访问私有成员
  • 类中的其他成员可以访问私有成员

7. 继承

"""
继承
"""


# 单继承
class Phone:
    IMEI = None
    producer = "HM"

    def call_by_4g(self):
        print("4G通话")


class Phone2023(Phone):
    face_id = "100101"

    def call_by_5g(self):
        print("5G通话")


phone = Phone2023()
print(phone.producer)
phone.call_by_4g()
phone.call_by_5g()


# 多继承
class NFCReader:
    nfc_type = "第五代"
    producer = "HW"

    def read_card(self):
        print("NFC读卡")

    def write_card(self):
        print("NFC写卡")


class RemoteControl:
    rc_type = "红外遥控"

    def control(self):
        print("开启红外遥控")


class MyPhone(Phone, NFCReader, RemoteControl):
    pass  # 补全语法


myphone = MyPhone()
myphone.call_by_4g()
myphone.control()

1. 继承:一个类,继承另一个类的成员变量和成员方法

    语法:

class 类(父类[, 父类2, ... , 父类N]):
    类内容体

    子类构建的类对象,可以

  • 有自己的成员变量和成员方法
  • 使用父类二点成员变量和成员方法

2. 单继承和多继承

单继承:一个类继承另一个类

多继承:一个类继承多个类,按照顺序从左到右依次继承

多继承中,如果父类有同名方法或属性,先继承的优先级高于后继承

3. pass关键字

pass是占位语句,用于保证函数(方法)或类定义的完整性,表示无内容,空的意思。

7.1 复写和使用父类成员

"""
复写
"""


class Phone:
    IMEI = None
    producer = "HM"

    def call_by_5g(self):
        print("5G通话")


# 定义子类,复写父类成员
class Phone2023(Phone):
    # face_id = "100101"
    producer = "NVIDIA"

    def call_by_5g(self):
        print("开启CPU单核")
        # print("5G通话")
        # 方法1
        print(f"父类的厂商是{Phone.producer}")
        Phone.call_by_5g(self)
        # 法2
        print(f"父类的厂商是{super().producer}")
        super().call_by_5g()
        print("关闭CPU单核")


phone = Phone2023()
print(phone.producer)
phone.call_by_5g()

1. 复写表示:对父类的成员属性或成员方法进行重新定义
2. 复写的语法:在子类中重新实现同名成员方法或成员属性即可
3. 在子类中,如何调用父类成员:

方法1:调用父类成员(适用于多继承)

        使用成员变量:父类名.成员变量

        使用成员方法:父类名.成员方法(self)

方法2:使用super()调用父类成员(适用于单继承)

        使用成员变量:super().成员变量

        使用成员方法:super().成员方法()

attention:只可以在子类内部调用父类的同名成员,子类的实体类对象调用默认是调用子类复写的。

8. 类型注解

8.1 变量的类型注解

"""
# 变量的类型注解
"""

# 基础数据类型注解
import json
import random

var_1: int = 10
var_2: str = 'nihao'
var_3: bool = True


# 类对象类型注解
class Student:
    pass


stu: Student = Student()

# 基础容器类型注解
my_list: list = [1, 2, 3]
my_tuple: tuple = (1, 2, 3)
my_dict: dict = {"id": 112}

# 容器类型详细注解
# my_list: list[int] = [2, 5, 3]
# my_tuple: tuple[int, str, bool] = (1, "nihaom", True)
# my_dict: dict[str, int] = {"id": 112}

# 在注释中进行类型注解
var_4 = random.randint(1, 10)  # type:int
var_5 = json.loads('{"name":"Lina"}')  # type:dict[str,str]


def func():
    return 10


var_6 = func()  # type:int

# 类型注解的限制

1. 什么是类型注解,有什么作用?
在代码中涉及数据交互之时,对数据类型进行显式的说明,可以帮助:

  • PyCharm等开发工具对代码做类型推断协助做代码提示
  • 开发者自身做类型的备注

2. 类型注解支持:

  • 变量的类型注解
  • 函数(方法)的形参和返回值的类型注解

3. 变量的类型注解语法

  • 语法1:        变量:类型
  • 语法2:        在注释中,# type:类型

4. 注意事项

  • 类型注解只是提示性的,并非决定性的。数据类型和注解类型无法对应也不会导致错误

8.2 函数和方法类型注解

"""
函数方法的类型注解
"""


# 对形参进行类型注解
def add(x: int, y: int):
    return x + y


# 对返回值进行类型注解
def func(data: list) -> list:
    return data


print(func([1, 4, 65]))

8.3 Union联合类型注解

"""
Union联合类型注解
"""
from typing import Union, List

my_list: List[Union[int, str]] = [1, 2, "union"]


def func(data: Union[int, str]) -> Union[int, str]:
    return data

9. 多态

"""
多态
"""


class Animal:
    def speak(self):
        pass


class Dog(Animal):
    def speak(self):
        print("汪汪汪")


class Cat(Animal):
    def speak(self):
        print("喵喵喵")


def make_noise(animal: Animal):
    animal.speak()


dog = Dog()
cat = Cat()

make_noise(dog)
make_noise(cat)


# 抽象类
class AC:
    def cool_wind(self):
        # 制冷
        pass

    def hot_wind(self):
        # 制热
        pass

    def swing_l_r(self):
        # 左右摆风
        pass


class Midea_AC(AC):
    def cool_wind(self):
        print("美的空调制冷")

    def hot_wind(self):
        print("美的空调制热")

    def swing_l_r(self):
        print("美的空调左右摆风")


class GREE_AC(AC):
    def cool_wind(self):
        print("格力空调制冷")

    def hot_wind(self):
        print("格力空调制热")

    def swing_l_r(self):
        print("格力空调左右摆风")


def make_cool(ac: AC):
    ac.cool_wind()


midea_ac = Midea_AC()
gree_ac = GREE_AC()

midea_ac.cool_wind()
gree_ac.cool_wind()

1. 什么是多态?
多态指的是,同一个行为,使用不同的对象获得不同的状态。
如,定义函数(方法),通过类型注解声明需要父类对象,实际传入子类对象进行工作,从而获得不同的工作状态
2. 什么是抽象类(接口)
包含抽象方法的类,称之为抽象类。抽象方法是指:没有具体实现的方法((pass)称之为抽象方法
3. 抽象类的作用
多用于做顶层设计(设计标准),以便子类做具体实现
也是对子类的一种软性约束,要求子类必须复写(实现)父类的一些方法
并配合多态使用,获得不同的工作状态。
 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值