初识对象
"""
初识对象
"""
# 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)