F:\BaiduNetdiskDownload\2023人工智能开发学习路线图\1、人工智能开发入门\1、零基础Python编程
1. 面向对象-其他
1.1 面向对象三大特征
封装将属性和⽅法书写到类的⾥⾯的操作即为封装封装可以为属性和⽅法添加私有权限继承⼦类默认继承⽗类的所有属性和⽅法⼦类可以重写⽗类属性和⽅法多态传⼊不同的对象,产⽣不同的结果
面向对象编程(OOP)的三大特征是封装、继承和多态。以下是对这三大特征的详细说明:
1. 封装(Encapsulation)
定义:
封装是将数据和操作数据的方法结合在一起,形成一个独立的对象。通过封装,内部实现细节可以隐藏,外部只能通过公开的方法访问和修改对象的状态。优点:
- 数据保护:可以防止外部直接访问和修改对象的内部状态。
- 接口简化:通过提供公共方法,简化了与对象的交互。
- 维护性:更改内部实现时,不会影响外部代码,只需确保公开的方法保持不变。
示例:
python
复制
class BankAccount: def __init__(self, balance=0): self.__balance = balance # 私有属性 def deposit(self, amount): if amount > 0: self.__balance += amount def withdraw(self, amount): if 0 < amount <= self.__balance: self.__balance -= amount def get_balance(self): return self.__balance # 公开方法访问私有属性 account = BankAccount() account.deposit(100) print(account.get_balance()) # 输出: 100
2. 继承(Inheritance)
定义:
继承是指一个类(子类)可以继承另一个类(父类)的属性和方法。通过继承,可以实现代码的重用和扩展。优点:
- 代码重用:避免重复编写相同的代码。
- 扩展性:可以在子类中扩展或修改父类的功能。
- 层次结构:形成清晰的类层次结构,便于管理和维护。
示例:
python
复制
class Animal: def speak(self): return "Animal sound" class Dog(Animal): def speak(self): return "Bark" class Cat(Animal): def speak(self): return "Meow" dog = Dog() cat = Cat() print(dog.speak()) # 输出: Bark print(cat.speak()) # 输出: Meow
3. 多态(Polymorphism)
定义:
多态是指不同类的对象可以通过相同的接口(方法)进行操作。具体执行的操作取决于对象的实际类型,而不是引用的类型。优点:
- 灵活性:可以用相同的方式处理不同类型的对象。
- 可扩展性:可以很容易地添加新类型而不影响现有代码。
示例:
python
复制
def animal_sound(animal): print(animal.speak()) animal_sound(Dog()) # 输出: Bark animal_sound(Cat()) # 输出: Meow
总结
- 封装:保护对象的内部状态,通过公共方法进行交互。
- 继承:允许子类继承和扩展父类的功能,促进代码重用。
- 多态:通过相同的接口处理不同类型的对象,提高代码的灵活性和可扩展性。
这三大特征共同构成了面向对象编程的基础,使得软件设计更加模块化、可维护和易于扩展。
1.2 多态
多态指的是⼀类事物有多种形态,(⼀个抽象类有多个⼦类,因⽽多态的概念依赖于继承)。定义:多态是⼀种使⽤对象的⽅式,⼦类重写⽗类⽅法,调⽤不同⼦类对象的相同⽗类⽅法,可以产⽣不同的执⾏结果好处:调⽤灵活,有了多态,更容易编写出通⽤的代码,做出通⽤的编程,以适应需求的不断变化!实现步骤:定义⽗类,并提供公共⽅法定义⼦类,并重写⽗类⽅法传递⼦类对象给调⽤者,可以看到不同⼦类执⾏效果不同
举例说明Python中多态的定义 ,好处和实现步骤
多态是面向对象编程中的一个重要特性,它允许不同类的对象通过相同的接口进行操作。下面是关于多态在 Python 中的定义、好处和实现步骤的详细说明。
多态的定义
在 Python 中,多态指的是不同类的实例可以使用相同的方法名,但实现的方式可以不同。通过这种方式,程序可以更灵活地处理不同类型的对象。
多态的好处
灵活性:
- 可以使用相同的接口处理不同类型的对象,增强了代码的灵活性。
可扩展性:
- 新的类可以很容易地被添加到系统中,而不需要更改现有代码。
提高可读性:
- 代码更具可读性,因为它使用统一的接口来处理不同的对象。
实现步骤
定义一个父类:
- 创建一个父类,定义一个方法(接口),这个方法会在子类中被重写。
定义子类:
- 创建一个或多个子类,重写父类的方法以实现不同的行为。
使用多态:
- 创建子类的实例,并通过父类的引用调用重写的方法。
示例
以下是一个具体的示例,展示了如何在 Python 中实现多态。
1. 定义一个父类
python
复制
class Animal: def speak(self): raise NotImplementedError("子类必须实现这个方法")
2. 定义子类
python
复制
class Dog(Animal): def speak(self): return "Bark" class Cat(Animal): def speak(self): return "Meow" class Cow(Animal): def speak(self): return "Moo"
3. 使用多态
python
复制
def animal_sound(animal): print(animal.speak()) # 创建对象 dog = Dog() cat = Cat() cow = Cow() # 使用多态 animal_sound(dog) # 输出: Bark animal_sound(cat) # 输出: Meow animal_sound(cow) # 输出: Moo
总结
- 多态的定义:不同类的对象可以通过相同的方法名进行操作,具体执行的行为取决于对象的实际类型。
- 好处:提供灵活性、可扩展性和提高代码可读性。
- 实现步骤:
- 定义一个父类并声明方法。
- 创建子类并重写父类的方法。
- 使用父类的引用调用子类的方法。
通过这种方式,多态使得代码更加灵活且易于扩展,适应不同的需求。
如何在实际项目中应用多态?
多态在实际项目中的应用非常广泛,特别是在设计灵活和可扩展的系统时。以下是一些常见的多态应用场景,以及相关示例。
1. 图形绘制应用
在图形绘制应用中,可以使用多态来处理不同类型的形状(如圆形、矩形等),而不需要知道具体的形状类型。
示例
python
复制
class Shape: def draw(self): raise NotImplementedError("子类必须实现这个方法") class Circle(Shape): def draw(self): return "Drawing a Circle" class Rectangle(Shape): def draw(self): return "Drawing a Rectangle" class Triangle(Shape): def draw(self): return "Drawing a Triangle" def draw_shapes(shapes): for shape in shapes: print(shape.draw()) # 使用示例 shapes = [Circle(), Rectangle(), Triangle()] draw_shapes(shapes)
2. 支付系统
在支付系统中,可以定义一个支付接口,多个支付方式(如信用卡、PayPal、银行转账)实现该接口。这样可以通过统一的方法处理不同的支付方式。
示例
python
复制
class Payment: def process_payment(self, amount): raise NotImplementedError("子类必须实现这个方法") class CreditCardPayment(Payment): def process_payment(self, amount): return f"Processing credit card payment of {amount}" class PayPalPayment(Payment): def process_payment(self, amount): return f"Processing PayPal payment of {amount}" def make_payment(payment_method, amount): print(payment_method.process_payment(amount)) # 使用示例 credit_card = CreditCardPayment() paypal = PayPalPayment() make_payment(credit_card, 100) # 输出: Processing credit card payment of 100 make_payment(paypal, 200) # 输出: Processing PayPal payment of 200
3. 日志记录系统
在日志记录系统中,可以定义一个日志接口,多个日志记录器(如文件日志、控制台日志)实现该接口。这样可以统一处理不同的日志输出方式。
示例
python
复制
class Logger: def log(self, message): raise NotImplementedError("子类必须实现这个方法") class FileLogger(Logger): def log(self, message): return f"Logging to file: {message}" class ConsoleLogger(Logger): def log(self, message): return f"Logging to console: {message}" def log_message(logger, message): print(logger.log(message)) # 使用示例 file_logger = FileLogger() console_logger = ConsoleLogger() log_message(file_logger, "File log entry") # 输出: Logging to file: File log entry log_message(console_logger, "Console log entry") # 输出: Logging to console: Console log entry
4. 游戏开发
在游戏开发中,可以使用多态来处理不同类型的游戏角色(如玩家、敌人、非玩家角色等),而不需要关心具体的角色类型。
示例
python
复制
class Character: def attack(self): raise NotImplementedError("子类必须实现这个方法") class Player(Character): def attack(self): return "Player attacks with sword!" class Enemy(Character): def attack(self): return "Enemy attacks with fireball!" def character_attack(character): print(character.attack()) # 使用示例 player = Player() enemy = Enemy() character_attack(player) # 输出: Player attacks with sword! character_attack(enemy) # 输出: Enemy attacks with fireball!
总结
在实际项目中,多态的应用可以显著提高代码的灵活性和可扩展性。通过定义统一的接口,不同的类可以实现相同的方法,允许开发者通过相同的方式处理不同类型的对象。这使得系统设计更加清晰,易于维护和扩展。
能否解释一下多态与继承的关系?
多态和继承是面向对象编程中两个紧密相关的重要概念。它们共同构成了 OOP 的核心思想,帮助开发者设计灵活、可扩展和易于维护的代码。以下是对多态与继承关系的详细解释:
1. 定义
继承:
- 继承是指一个类(子类)从另一个类(父类)继承属性和方法。子类可以重用父类的代码,并且可以扩展或重写父类的方法。
多态:
- 多态是指不同类的对象可以通过相同的方法名进行操作。这些方法在不同类中的实现可能不同,具体执行的行为取决于对象的实际类型。
2. 它们的关系
多态依赖于继承:
- 多态的实现通常依赖于继承。通过继承,子类可以重写父类的方法,从而实现多态性。这意味着多态通常出现在有继承关系的类中。
接口统一:
- 继承允许子类通过父类的接口进行操作。当多个子类重写同一父类的方法时,父类的接口提供了一种统一的方式来处理不同的子类。这就是多态的体现。
3. 示例
以下示例可以帮助更好地理解多态与继承的关系:
python
复制
class Animal: def speak(self): raise NotImplementedError("子类必须实现这个方法") class Dog(Animal): def speak(self): return "Bark" class Cat(Animal): def speak(self): return "Meow" def animal_sound(animal): print(animal.speak()) # 创建对象 dog = Dog() cat = Cat() # 使用多态,通过父类引用调用子类的方法 animal_sound(dog) # 输出: Bark animal_sound(cat) # 输出: Meow
4. 总结
- 继承提供了代码复用和扩展的能力,使得子类能够继承和重用父类的属性和方法。
- 多态使得程序可以通过统一的接口处理不同类型的对象,具体的行为由对象的实际类型决定。
通过继承,子类可以实现多态,允许同一方法名在不同类中表现出不同的行为。这种关系使得面向对象编程更加灵活和强大。
能否详细解释一下如何实现支付系统中的多态?
实现支付系统中的多态通常涉及定义一个统一的接口或抽象类,多个具体的支付方式(如信用卡、PayPal、银行转账等)实现该接口。以下是实现支付系统中多态的详细步骤和示例。
1. 定义支付接口
首先,创建一个支付接口或抽象类,定义所有支付方式必须实现的方法。
示例
python
复制
class Payment: def process_payment(self, amount): raise NotImplementedError("子类必须实现这个方法")
2. 实现具体支付方式
创建多个具体的支付类,继承支付接口并实现其方法。
示例
python
复制
class CreditCardPayment(Payment): def process_payment(self, amount): return f"Processing credit card payment of ${amount:.2f}" class PayPalPayment(Payment): def process_payment(self, amount): return f"Processing PayPal payment of ${amount:.2f}" class BankTransferPayment(Payment): def process_payment(self, amount): return f"Processing bank transfer payment of ${amount:.2f}"
3. 使用多态进行支付处理
定义一个函数,该函数接受支付接口类型的参数,并调用其方法。这样,无论传入哪种支付方式,都可以通过相同的接口进行处理。
示例
python
复制
def make_payment(payment_method, amount): print(payment_method.process_payment(amount))
4. 示例使用
现在可以创建不同的支付对象,并通过统一的
make_payment
函数进行支付。示例
python
复制
# 创建支付对象 credit_card = CreditCardPayment() paypal = PayPalPayment() bank_transfer = BankTransferPayment() # 使用多态进行支付 make_payment(credit_card, 100) # 输出: Processing credit card payment of $100.00 make_payment(paypal, 200) # 输出: Processing PayPal payment of $200.00 make_payment(bank_transfer, 300) # 输出: Processing bank transfer payment of $300.00
总结
在这个支付系统的实现中,多态的使用使得代码更加灵活和易于扩展:
- 定义支付接口:通过创建一个抽象类
Payment
,定义了一个统一的方法process_payment
。- 实现具体支付方式:每个支付方式(如
CreditCardPayment
、PayPalPayment
和BankTransferPayment
)都实现了process_payment
方法,提供了具体的支付逻辑。- 使用多态进行支付处理:通过统一的
make_payment
函数,可以方便地处理不同的支付方式,而不需要关心具体的支付实现。这种设计使得添加新的支付方式变得简单,只需创建新的类并实现
process_payment
方法,而无需修改现有的代码。这体现了面向对象编程中多态的优势。
如何处理支付失败的情况?
处理支付失败的情况是构建健壮支付系统的重要部分。以下是一些常见的方法和最佳实践来处理支付失败的情况。
1. 定义异常类
首先,可以定义自定义异常类,以便在支付过程中抛出特定的错误。
示例
python
复制
class PaymentError(Exception): pass
2. 修改支付接口
在支付接口中,可以添加一个返回值或抛出异常来指示支付结果。
示例
python
复制
class Payment: def process_payment(self, amount): raise NotImplementedError("子类必须实现这个方法")
3. 实现具体支付方式并处理失败
在具体支付方式的实现中,可以模拟支付失败的情况,并抛出
PaymentError
。示例
python
复制
import random class CreditCardPayment(Payment): def process_payment(self, amount): if random.choice([True, False]): # 随机模拟支付成功或失败 return f"Processing credit card payment of ${amount:.2f}" else: raise PaymentError("Credit card payment failed.") class PayPalPayment(Payment): def process_payment(self, amount): if random.choice([True, False]): # 随机模拟支付成功或失败 return f"Processing PayPal payment of ${amount:.2f}" else: raise PaymentError("PayPal payment failed.") class BankTransferPayment(Payment): def process_payment(self, amount): if random.choice([True, False]): # 随机模拟支付成功或失败 return f"Processing bank transfer payment of ${amount:.2f}" else: raise PaymentError("Bank transfer payment failed.")
4. 捕获和处理支付失败
在调用支付方法的地方,使用
try
和except
块来捕获支付失败的异常。示例
python
复制
def make_payment(payment_method, amount): try: result = payment_method.process_payment(amount) print(result) except PaymentError as e: print(f"支付失败: {e}")
5. 示例使用
创建不同的支付对象,并通过统一的
make_payment
函数进行支付,处理支付失败的情况。示例
python
复制
# 创建支付对象 credit_card = CreditCardPayment() paypal = PayPalPayment() bank_transfer = BankTransferPayment() # 使用多态进行支付,处理失败情况 make_payment(credit_card, 100) make_payment(paypal, 200) make_payment(bank_transfer, 300)
6. 记录支付失败
可以在捕获异常的地方记录支付失败的详细信息,以便后续分析和调试。
示例
python
复制
import logging logging.basicConfig(filename='payment_errors.log', level=logging.ERROR) def make_payment(payment_method, amount): try: result = payment_method.process_payment(amount) print(result) except PaymentError as e: logging.error(f"支付失败: {e},金额: {amount}") print(f"支付失败: {e}")
总结
在处理支付失败的情况下,建议采取以下步骤:
- 定义异常类:创建自定义异常类以便于处理特定的支付错误。
- 修改支付接口:在支付接口中定义支付结果的返回方式或异常抛出。
- 实现具体支付方式:在具体的支付实现中模拟支付成功与失败,并抛出异常。
- 捕获和处理异常:在调用支付方法时,使用
try
和except
捕获支付失败的情况。- 记录错误信息:记录支付失败的详细信息,便于后续分析。
通过这些步骤,可以有效地处理支付失败情况,提高支付系统的可靠性和用户体验
可以介绍一些常见的支付失败原因吗?
支付失败可能由多种原因引起,以下是一些常见的支付失败原因及其简要说明:
1. 资金不足
用户的账户余额不足以完成交易。这是最常见的支付失败原因之一,尤其在使用借记卡或银行转账时。
2. 信用卡过期
用户的信用卡已过有效期,导致支付无法完成。支付系统通常会检查卡片的有效性。
3. 卡片信息错误
用户输入的卡片信息(如卡号、有效期、安全码)不正确,导致支付无法成功。
4. 银行拒绝交易
银行可能因为安全原因拒绝交易,例如:
- 可疑的交易活动
- 交易金额超过限额
- 用户设置的交易限制
5. 网络问题
支付过程中可能出现网络连接问题,例如:
- 用户的网络不稳定
- 支付网关或银行的服务器故障
6. 支付网关问题
支付网关服务出现故障或维护,导致交易无法处理。这可能包括技术问题或服务中断。
7. 账户问题
用户的支付账户可能存在问题,例如:
- 帐户被冻结
- 用户未验证身份或未完成身份验证
8. 货币不匹配
用户尝试使用不同于商家支持的货币付款时,可能会导致支付失败。某些支付方式可能不支持特定货币。
9. 超时问题
如果支付处理时间过长,可能导致交易超时并失败,尤其是在用户未能确认支付时。
10. 地区限制
某些支付方式可能在特定地区不可用,导致交易无法完成。例如,某些信用卡在国际交易时可能会被拒绝。
11. 身份验证失败
如果使用安全的支付方式(如 3D Secure),用户在身份验证步骤中可能失败,例如输入错误的动态密码。
12. 支付限额
用户的卡片或支付账户可能设置了每日或单笔交易限额,导致超出限额的交易被拒绝。
总结
了解这些常见的支付失败原因可以帮助开发者在支付系统中更好地处理异常情况,并向用户提供清晰的错误信息和解决方案。这不仅提高了用户体验,也有助于降低由于支付失败导致的交易损失。
可以提供一些常见的支付解决方案吗?
,以下是一些常见的支付解决方案,适用于不同类型的业务需求和技术环境:
1. 第三方支付网关
这些服务提供了一整套支付处理解决方案,通常支持多种支付方式。
- PayPal:广泛使用的在线支付平台,支持信用卡、借记卡和PayPal账户支付。
- Stripe:提供全面的API支持,适合开发者,可以处理各种支付方式和货币。
- Square:适合小型企业,提供在线和线下支付处理。
- Authorize.Net:支持信用卡、电子支票等多种支付方式,适合电子商务网站。
2. 移动支付解决方案
这些解决方案专注于移动设备上的支付体验。
- Apple Pay:允许用户通过iPhone、iPad和Apple Watch进行安全支付。
- Google Pay:支持Android设备上的快捷支付,集成多种支付方式。
- WeChat Pay:在中国非常流行的移动支付解决方案,适合社交和电子商务场景。
- Alipay:另一个在中国广泛使用的支付平台,支持多种支付方式。
3. 银行转账和电子钱包
这些解决方案适合需要直接从银行账户转账的场景。
- ACH转账:在美国常用的电子转账方式,适合大额支付和定期支付。
- SEPA转账:在欧洲地区常用的跨境支付方式,适合欧元区内的银行转账。
- 电子钱包:如Venmo、Zelle,适合个人间的小额支付。
4. 订阅和定期支付解决方案
适合提供订阅服务的业务,支持定期收费。
- Chargebee:提供订阅管理和定期收费功能,适合SaaS和服务型企业。
- Recurly:支持多种定期支付解决方案,能够处理复杂的订阅模型。
5. 自定义支付解决方案
对于有特定需求的企业,可以开发自定义支付模块。
- 使用支付API:许多支付网关(如Stripe、Braintree)提供API,可以根据业务需求进行自定义开发。
- 开源支付解决方案:如Magento、WooCommerce等平台,可以根据需求扩展。
6. 安全和合规性解决方案
确保支付处理符合安全标准和法规。
- PCI DSS合规:确保处理信用卡支付时遵循支付卡行业数据安全标准。
- 3D Secure:增加额外的身份验证步骤,降低欺诈风险。
7. 国际支付解决方案
适合需要处理多种货币和跨境交易的企业。
- TransferWise(现为 Wise):提供低成本的国际转账服务。
- Payoneer:适合跨境电商和自由职业者,支持多种货币的收款。
总结
根据业务需求和目标客户的支付习惯,选择合适的支付解决方案非常重要。可以考虑使用第三方支付网关以简化集成,或根据特定需求开发自定义解决方案。在选择时,确保考虑安全性、合规性和用户体验。
1.3 类属性和实例属性
在Python中,类属性和实例属性是面向对象编程中重要的概念。类属性是属于整个类的属性,而实例属性则是属于类的实例(对象)的属性。下面是一个例子,演示了类属性和实例属性的用法:
class Person: # 类属性 species = "Human" def __init__(self, name, age): # 实例属性 self.name = name self.age = age # 创建两个实例 person1 = Person("Alice", 30) person2 = Person("Bob", 25) # 访问类属性 print(Person.species) # 输出: Human # 访问实例属性 print(person1.name) # 输出: Alice print(person2.age) # 输出: 25 # 修改实例属性 person1.age = 35 print(person1.age) # 输出: 35 # 类属性在所有实例之间共享 Person.species = "Homo Sapiens" print(person2.species) # 输出: Homo Sapiens
Copy在上面的例子中,
species
是一个类属性,所有Person
类的实例共享该属性。而name
和age
是实例属性,每个Person
类的实例拥有独立的这些属性,这些属性的值可以在每个实例中独立进行修改。类属性通常用于描述整个类的特征,而实例属性则用于描述每个实例个体的属性。
解释一下属性的访问控制?
在 Python 中,属性的访问控制是通过命名约定来实现的,主要有三种访问控制级别:公有属性、受保护属性和私有属性。这些控制机制帮助开发者管理属性的可访问性,从而提高代码的封装性和安全性。以下是对这三种访问控制的详细解释。
1. 公有属性(Public Attributes)
定义:
公有属性是默认的属性访问级别,任何类的实例和外部代码都可以直接访问。示例:
python
复制
class Dog: def __init__(self, name): self.name = name # 公有属性 dog = Dog("Buddy") print(dog.name) # 输出: Buddy
2. 受保护属性(Protected Attributes)
定义:
受保护属性以单个下划线(_
)开头,表示该属性不应该在类外部直接访问。虽然 Python 并不强制执行这一规则,但这是一个约定,表明该属性是内部使用的。示例:
python
复制
class Dog: def __init__(self, name): self._name = name # 受保护属性 def get_name(self): return self._name dog = Dog("Buddy") print(dog.get_name()) # 输出: Buddy print(dog._name) # 虽然可以访问,但不推荐
3. 私有属性(Private Attributes)
定义:
私有属性以双下划线(__
)开头,Python 会对其名称进行改名(名称重整),使得该属性不能在类外部直接访问。私有属性主要用于防止子类访问或重写。示例:
python
复制
class Dog: def __init__(self, name): self.__name = name # 私有属性 def get_name(self): return self.__name dog = Dog("Buddy") print(dog.get_name()) # 输出: Buddy # print(dog.__name) # 会引发 AttributeError # 访问私有属性的方法(不推荐) print(dog._Dog__name) # 输出: Buddy
总结
公有属性:
- 默认访问级别,任何地方都可以访问。
受保护属性:
- 以单个下划线开头,表示该属性不应在类外部访问,主要用于内部使用。
私有属性:
- 以双下划线开头,使用名称重整机制使其无法在类外部直接访问,主要用于防止子类访问和重写。
通过这些访问控制机制,Python 提供了一种灵活的方式来管理属性的可访问性,提高代码的封装性和安全性。虽然 Python 的访问控制机制并不严格,但遵循这些约定可以使代码更加清晰和可维护。
实例属性可以是可变类型吗?
实例属性可以是可变类型。在 Python 中,实例属性可以包含任何类型的对象,包括可变类型和不可变类型。以下是一些关于可变类型和实例属性的详细说明:
1. 可变类型
可变类型是指其内容可以在原地修改而不需要创建新对象的类型。常见的可变类型包括:
- 列表(
list
)- 字典(
dict
)- 集合(
set
)2. 实例属性作为可变类型
当实例属性是可变类型时,您可以在对象的生命周期内修改这些属性的内容。这种特性可以灵活地管理对象的状态,但也需要注意在多个实例之间共享可变对象时可能引发的问题。
示例:
class Dog: def __init__(self, name): self.name = name # 实例属性(字符串,不可变) self.tricks = [] # 实例属性(列表,可变) def add_trick(self, trick): self.tricks.append(trick) # 修改可变属性 # 创建实例 dog1 = Dog("Buddy") dog2 = Dog("Max")
3. 共享可变对象的注意事项
如果多个实例共享同一个可变对象,修改那个对象的内容会影响所有实例。这种情况下需要小心,以免意外更改:
示例:
python
复制
class Dog: shared_tricks = [] # 类属性(列表,可变) def __init__(self, name): self.n