一、类的创建
1.类的大致描述:
类就像是一个制作饼干的模具。这个模具决定了饼干的形状(属性),比如是圆形、方形,以及饼干有什么特点(比如上面有巧克力豆)。同时,模具也规定了可以对饼干做什么(方法),比如可以把饼干掰成两半,或者在饼干上涂果酱。
2.类的基本框架
class 类的名称(): #class为保留子表示此处创建一个类
'''类的说明文档''' #类的功能和方法说明,便于其他用户使用,可省略
def __int__(self,参数1,参数2,.....): #类的一个初始化方法,是一个特殊方法(实在看不懂就记住时间长了就懂了)
代码块1
def 方法名1(self,参数3,参数4,......): #创建类的方法
代码块2 #代码块2处填该方法的具体代码
def 方法名2(self, 参数5, 参数6, ......):
代码块3
......
示例代码:
class Cookie: def __init__(self, shape, has_chocolate=False): """初始化饼干的属性""" self.shape = shape # 饼干形状(如圆形、方形) self.has_chocolate = has_chocolate # 是否有巧克力豆 self.is_broken = False # 饼干是否被掰断 self.toppings = [] # 饼干上的配料 def break_cookie(self): """将饼干掰成两半""" if self.is_broken: # 修改为直接判断is_broken为True的情况 return "饼干已经是碎的了..." else: self.is_broken = True return f"{self.shape}饼干被掰成了两半!" def add_topping(self, topping): """在饼干上添加配料(如涂果酱)""" self.toppings.append(topping) return f"饼干上添加了{topping}!" def __str__(self): """返回饼干的描述信息""" status = "碎的" if self.is_broken else "完整的" chocolate = "有巧克力豆的" if self.has_chocolate else "普通" toppings = f",上面有{', '.join(self.toppings)}" if self.toppings else "" return f"一个{status}、{chocolate}{self.shape}{toppings}饼干" #返回值 a = Cookie('Round',True) #'round' 给self.shape赋值,has_chocol=True a.is_broken = False #饼干被掰碎是False a.toppings.append('jam') #上面的调料是jam print(a)
3.类的面向对象
对象:是类的具体实例。在使用类和类中的方法时,需要通过调用类来创建类的对象。
上述代码中的“a”就是类的Cookie类的一个面向对象。
其形设计如下
对象=类名(实参)
创建对象后,可以通过对象名使用类中的方法。使用形式如下:
对象.方法名.(参数)
示例代码:
a = Cookie('Round',True) #创建对象 'round' 给self.shape赋值,has_chocol=True
a.is_broken = False #调用类的方法 饼干被掰碎是False
a.toppings.append('jam') #上面的调料是jam
动态添加属性
Python 允许在创建对象后动态添加属性(不推荐在生产代码中频繁使用):
a = Cookie("星形")
a.color = "红色" # 动态添加color属性
print(cookie.color) # 输出:红色
print(a)

| 概念 | 描述 | 示例 |
|---|---|---|
| 类(Class) | 对象的抽象模板 | class Cookie: ... |
| 对象(Object) | 类的具体实例 | cookie = Cookie("圆形") |
| 属性(Attribute) | 对象的状态数据 | cookie.shape |
| 方法(Method) | 对象的行为或操作 | cookie.break_cookie() |
| 实例化(Instantiation) | 创建对象的过程 | Cookie() 调用类创建对象 |
类的继承
类的继承框架:
class 子类名(父类名): # 括号中写父类名,表示继承
# 子类可以添加自己的类属性
# 子类初始化方法(可选,若需要扩展父类属性)
def __init__(self, 父类参数, 子类参数):
# 调用父类的初始化方法(必须写,否则父类属性无法初始化)
super().__init__(父类参数) # 等价于 父类名.__init__(self, 父类参数)必写
# 添加子类自己的实例属性
代码块
def 方法1()...
1. 父类与子类
-
父类:被继承的类,也叫 “基类”,定义通用的属性和方法(例如 “动物” 类)。
-
子类:继承父类的类,也叫 “派生类”,可以复用父类功能并添加特有功能(例如 “狗” 类继承 “动物” 类)。
2. super() 函数
用于调用父类的方法,确保父类的属性和方法被正确初始化和执行。在子类的__init__方法中必须调用父类的__init__(否则父类属性不会被初始化)。
3. 方法重写(Override)
子类可以定义与父类同名的方法,覆盖父类的原有实现,实现 “子类特有的行为”。
4. 继承的传递性
如果 B 继承 A,C 继承 B,那么 C 会同时拥有 A 和 B 的属性和方法(例如 “金毛犬” 继承 “狗”,“狗” 继承 “动物”,则 “金毛犬” 拥有三者的功能)。
示例代码:
# 父类:通用饼干
class Cookie:
def __init__(self, shape, has_chocolate=False):
self.shape = shape # 形状
self.has_chocolate = has_chocolate # 是否有巧克力豆
self.is_broken = False # 是否破碎
def break_cookie(self):
if self.is_broken:
return "已经碎了!"
self.is_broken = True
return f"{self.shape}饼干被掰碎了"
def __str__(self):
status = "碎的" if self.is_broken else "完整的"
return f"一个{status}的{self.shape}饼干"
# 子类:曲奇饼干(继承Cookie,添加特有属性和方法)
class CookieCookie(Cookie): # 继承自Cookie
def __init__(self, shape, butter_content):
# 调用父类的初始化方法(必须)
super().__init__(shape, has_chocolate=True) # 曲奇默认有巧克力豆
# 子类特有属性:黄油含量
self.butter_content = butter_content
# 子类特有方法:判断是否酥脆
def is_crispy(self):
return self.butter_content > 30 # 黄油含量>30%则酥脆
# 重写父类的break_cookie方法(曲奇易碎,破碎后有特殊描述)
def break_cookie(self):
result = super().break_cookie() # 先调用父类的掰碎逻辑
return result + "(曲奇碎成了好多小块)"
# 创建曲奇饼干对象
cookie = CookieCookie("圆形", butter_content=40)
print(cookie) # 输出:一个完整的的圆形饼干
print(cookie.break_cookie()) # 输出:圆形饼干被掰碎了(曲奇碎成了好多小块)
print("是否酥脆:", cookie.is_crispy()) # 输出:是否酥脆:True
# 创建苏打饼干对象
soda = SodaCookie("方形", salt_content=6)
print(soda.break_cookie()) # 输出:方形饼干被掰碎了(复用父类方法)
print("是否够咸:", soda.is_salty()) # 输出:是否够咸:True
1.在子类中添加方法
子类中的该部分表明,子类中可以添加父类中没有的方法。
# 子类特有方法:判断是否酥脆
def is_crispy(self):
return self.butter_content > 30 # 黄油含量>30%则酥脆
2.覆盖父类中的方法
当需要对父类中的方法进行修改、调整时,可以通过子类重新编写父类的方法。
在执行子类中的方法时会自动覆盖父类中的相应方法。
# 重写父类的break_cookie方法(曲奇易碎,破碎后有特殊描述)
def break_cookie(self):
result = super().break_cookie() # 先调用父类的掰碎逻辑
return result + "(曲奇碎成了好多小块)"
3.在一个类中导入另一个类

将上图中的类导入另一个类中代码如下
from cookie import Cookie
class CookieJar:
def __init__(self):
self.cookies = [] # 饼干罐中的饼干列表
def add_cookie(self, cookie):
if isinstance(cookie, Cookie):
self.cookies.append(cookie)
return "饼干已添加到饼干罐中"
else:
return "只能添加 Cookie 类型的对象"
def remove_cookie(self, index):
if 0 <= index < len(self.cookies):
removed_cookie = self.cookies.pop(index)
return f"移除了饼干:{removed_cookie}"
else:
return "无效的索引"
def __str__(self):
if not self.cookies:
return "饼干罐是空的"
return "\n".join(str(cookie) for cookie in self.cookies)
# 创建一些饼干
cookie1 = Cookie("圆形", has_chocolate=True)
cookie2 = Cookie("方形", has_chocolate=False)
# 创建一个饼干罐
jar = CookieJar()
# 将饼干添加到饼干罐中
print(jar.add_cookie(cookie1)) # 输出:饼干已添加到饼干罐中
print(jar.add_cookie(cookie2)) # 输出:饼干已添加到饼干罐中
# 打印饼干罐中的饼干
print(jar) # 输出:饼干罐中的所有饼干
# 移除一个饼干
print(jar.remove_cookie(0)) # 输出:移除了饼干:一个完整的圆形饼干
print(jar) # 输出:饼干罐中剩余的饼干
运行结果如下
综合案例:
项目描述:
某公司需要设计一个快递机器人程序,用于实现帮助用户寄件和取件。
项目任务:
模拟填单和取件时获取单号的功能
项目实现代码
class Robot():
def __int__(self):
print('我是您的快递小助手')
self.bill = 20230100
self.postage = {'北京':15,'上海':12,'广东':13}
self.q_number = [100,101,105]
def send_ex(self):
print('请填写您的寄件信息:')
self.addr = input('您的寄件地址:')
self.number = input('您的手机号码:')
self.name = input('您的姓名:')
print('您需要支付',self.postage[ self.addr[0:2] ],'元')
self.bill+=1
print('账单生成中\n您的寄件单号:',self.bill)
def collect_ex(self):
self.c_list = int(input('请输入您的取件号:'))
if self.c_list in self.q_numberL:
print('您的快递已找到,请扫码领取。')
self.q_number.pop()
else:
print('未找到您的快递')
a = Robot()
a.send_ex()

11万+

被折叠的 条评论
为什么被折叠?



