python类的基本介绍

该文章已生成可运行项目,

一、类的创建

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()

本文章已经生成可运行项目
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值