「Python」第二阶段第一章笔记

发布时间 2023-08-20 16:07:03作者: OrzMiku

初识对象

"""
初识对象
"""

# 1. 设计一个类
class Stu:
    name = None # 学生姓名
    gender = None # 学生性别
    nationality = None # 学生国籍
    native_place = None # 学生籍贯
    age = None # 学生年龄

# 2. 创建一个对象
stu_1 = Stu()

# 3. 对象属性进行赋值
stu_1.name = "张三"
stu_1.gender = "男"
stu_1.nationality = "中国"
stu_1.native_place = "杨陵"
stu_1.age = 18

# 4. 获取对象中记录的值
print(stu_1.name)
print(stu_1.gender)
print(stu_1.nationality)
print(stu_1.native_place)
print(stu_1.age)

成员方法

"""
成员方法
"""

class Stu: # 类
    # 类的属性 -> 成员变量
    # 类的行为 -> 成员方法
    name = None # 学生姓名
    gender = None # 学生性别
    nationality = None # 学生国籍
    native_place = None # 学生籍贯
    age = None # 学生年龄

    # 成员方法,self可以访问自身的属性
    def pInfo(self): # 看起来参数列表有一个参数,其实是零个,self不算
        """
        输出学生信息
        :return: None
        """
        print(f"姓名: {self.name}")
        print(f"性别: {self.gender}")
        print(f"国籍: {self.nationality}")
        print(f"籍贯: {self.native_place}")
        print(f"年龄: {self.age}岁")

stu_1 = Stu()
stu_1.name = "张三"
stu_1.gender = "男"
stu_1.nationality = "中国"
stu_1.native_place = "杨陵"
stu_1.age = 18

# 调用类方法打印学生信息
stu_1.pInfo()

类和对象

"""
类和对象
类 -> 图纸
对象 -> 用图纸制造出来的实体
"""

class clock:
    id = None
    price = 19.99

    def ring(self):
        if(self.id != None):
            import winsound
            print(f"闹钟{self.id}响了!")
            winsound.Beep(2000,3000)
        else:
            print("该闹钟未初始化id")

# 根据图纸clock生产出一个my_clock
# 新建一个clock对象叫做my_clock
my_clock = clock()

# 闹钟出厂设置id
my_clock.id = 114514

# 响铃(只有出厂设置了id的闹钟才可以响铃)
my_clock.ring()

构造方法

"""
构造方法
__init__()
 - 创建对象时会自动执行
 - 创建对象时传参会自动交给构造方法
"""

class Stu: # 类
    # 类的属性 -> 成员变量
    # 类的行为 -> 成员方法
    name = None # 学生姓名
    gender = None # 学生性别
    nationality = None # 学生国籍
    native_place = None # 学生籍贯
    age = None # 学生年龄

    def __init__(self,name,gender,nationality,native_place,age):
        self.name = name
        self.gender = gender
        self.nationality = nationality
        self.native_place = native_place
        self.age = age

    # 成员方法,self可以访问自身的属性
    def pInfo(self): # 看起来参数列表有一个参数,其实是零个,self不算
        """
        输出学生信息
        :return: None
        """
        print(f"姓名: {self.name}")
        print(f"性别: {self.gender}")
        print(f"国籍: {self.nationality}")
        print(f"籍贯: {self.native_place}")
        print(f"年龄: {self.age}岁")

stu_1 = Stu("张三","男","中国","杨陵",18) # 构造函数传参,对属性初始化赋值

# 调用类方法打印学生信息
stu_1.pInfo()

魔术方法

"""
魔术方法
具有特殊功能的内置方法
"""

class Stu: # 类
    # 类的属性 -> 成员变量
    # 类的行为 -> 成员方法
    name = None # 学生姓名
    gender = None # 学生性别
    nationality = None # 学生国籍
    native_place = None # 学生籍贯
    age = None # 学生年龄

    def __init__(self,name,gender,nationality,native_place,age): # 构造方法
        self.name = name
        self.gender = gender
        self.nationality = nationality
        self.native_place = native_place
        self.age = age

    def __str__(self):
        # 控制把对象转变为字符串的行为
        return f"Student类对象"

    def __lt__(self, other):
        # 定义小于号的功能(运算符重载)
        # return self.age > other.age 如果这样写小于号的功能就是大于
        return self.age < other.age

    def __le__(self, other):
        # 定义小于等于号的功能(运算符重载)
        # return self.age >= other.age 如果这样写小于等于号的功能就是大于等于
        return self.age <= other.age

    def __eq__(self, other):
        # 定义等于号的功能(运算符重载)
        return self.age == other.age

    # 成员方法,self可以访问自身的属性
    def pInfo(self): # 看起来参数列表有一个参数,其实是零个,self不算
        """
        输出学生信息
        :return: None
        """
        print(f"姓名: {self.name}")
        print(f"性别: {self.gender}")
        print(f"国籍: {self.nationality}")
        print(f"籍贯: {self.native_place}")
        print(f"年龄: {self.age}岁")

stu_1 = Stu("张三","男","中国","杨陵",18)
stu_2 = Stu("李四","男","中国","杨陵",18)
print(stu_1 == stu_2)
print(stu_1 >= stu_2)
print(stu_1 <= stu_2)
print(stu_1 > stu_2)
print(stu_1 < stu_2)

封装

"""
封装
将现实事物描述为类的一种思想
私有成员,只能在类内部访问,不对外开放,以__开头
"""

class User:
    username = None
    __password = None
    publicInfo = {
        "nickname": str(),
        "gender": str(),
        "age": int()
    }
    __privateInfo = {
        "idCard": int()
    }

    def __init__(self):
        self.register()

    def register(self):
        print("注册程序")
        self.username = input("用户名: ")
        password = input("密码: ")
        password_confirm = input("再次输入密码: ")
        if password != password_confirm:
            print("两次输入的密码不一致,请重新注册!")
            self.register()
            return
        else:
            self.__password = password
        self.publicInfo['nickname'] = input("昵称: ")
        self.publicInfo['gender'] = input("性别: ")
        self.publicInfo['age'] = int(input("年龄: "))
        self.__privateInfo['idCard'] = int(input("idCard: "))
        self.__welcome()

    def __welcome(self):
        # 私有方法
        # 这个方法会打印密码,因此不希望用户使用,只能由注册方法使用
        print("恭喜你注册成功!下面是你的用户名和密码,请一定牢记!")
        print(f"用户名: {self.username}\n密码: {self.__password}")

    def __loginSuccessful(self):
		# 私有方法
        # 这个方法会打印隐私信息,因此不希望用户使用,只能由注册方法使用
        print(f"欢迎回来,{self.publicInfo['nickname']}")
        print(f"用户名: {self.username}")
        print(f"公开信息: {self.publicInfo}")
        print(f"私有信息: {self.__privateInfo}")

    def login(self):
        print("登录程序")
        un = input("用户名: ")
        pwd = input("密码: ")
        if(un == self.username and pwd == self.__password):
            self.__loginSuccessful()
        else:
            print("登陆失败!")
            self.login()
            return

new_user = User() # 新建一个用户,会触发注册程序

new_user.login() # 登录用户

继承

"""
继承
"""

class aPhone8:
    module = "aphone 8"         # 型号
    producer = "ipple"          # 生产厂商

    def call_by_3g(self):
        print("正在使用3g通话")

    def call_by_4g(self):
        print("正在使用4g通话")

class NFC:
    def nfc(self):
        print("正在调用NFC功能")

class aPhone13(aPhone8,NFC): # 继承

    module = "aphone 13"         # 型号

    def call_by_4g(self): # 更新换代
        print("正在使用满血4g通话")

    def call_by_5g(self): # 新功能, 鉴定为烂中烂
        print("无5G信号")

class Ture5G:
    def call_by_5g(self):
        print("正在使用5g通话")

class changenameto14:
    module = "aphone 14"

class aPhone14(changenameto14,Ture5G,aPhone13): # 多继承,左优先
    # aPhone14, 鉴定为 aPhone13
    pass # 不添加新功能, 空, 加pass不会报错

phone1 = aPhone8()
phone2 = aPhone13()
phone3 = aPhone14()

print("----------------------")
print(f"Phone1: {phone1.module} by {phone1.producer}")
phone1.call_by_3g()
phone1.call_by_4g()
print("----------------------")
print(f"Phone2: {phone2.module} by {phone2.producer}")
phone2.call_by_3g()
phone2.call_by_4g()
phone2.call_by_5g()
phone2.nfc()
print("----------------------")
print(f"Phone3: {phone3.module} by {phone3.producer}")
phone3.call_by_3g()
phone3.call_by_4g()
phone3.call_by_5g()
phone3.nfc()
print("----------------------")

补充 父类成员的调用

# 补充,父类成员复写和父类成员调用
class phone:
    def call_by_5g(self):
        print('使用5g通话')


class phoneNext(phone):
    def call_by_5g(self):  # 复写父类方法
        print('已开启隐私保护')
    # 下面这句也可以用 super.call_by_5g()
        phone.call_by_5g(self)

new_phone = phoneNext()
new_phone.call_by_5g()

类型注解

"""
类型注解
"""

isok: bool = False
my_list: list[int] = [1,1,4,5,1,4]
my_tuple: tuple[str,int] = ("张三",18) # 需要标注每个元素的类型
my_set: set[str] = {"张三","李四","王麻子"}
my_dict: dict[str,int] = {"张三":18,"李四":18} # key和value的类型

# 也可在注释中类型注解
istrue = False # type: bool

# def func(xxx: 类型注解,...) -> 返回值注解:
def add(a: int ,b: int) -> int:
    return a+b

print(add(114.0,514)) # 注解是建议性的不是强制性的

补充 Union联合注解

# 导包
from typing import Union
# 补充 Union联合注解
mix_list: list[Union[int, str]] = [1,2,"3","4","5"]
mix_dict: dict[str, Union[int, str]] = {"姓名":"张三","年龄":18}

多态

"""
多态
"""

class animal: # 抽象类: 有抽象方法的类
    def speak(self): # 抽象方法: 直接pass,没有具体功能
        pass

class dog(animal):
    # 继承了抽象类,抽象方法在这个类中具体实现
    def speak(self):
        print("汪汪汪!")

class cat(animal):
    # 继承了抽象类,抽象方法在这个类中具体实现
    def speak(self):
        print("喵喵喵~")

def mknoise(animal: animal):
    # 多态, 通过传入不同的子类来实现不同的状态
    animal.speak()
my_cat = cat()
my_dog = dog()
mknoise(my_cat)
mknoise(my_dog)