代码拉取完成,页面将自动刷新
"""
示例:六个 Python 类,演示多种知识点
包含内容:
1. 私有属性与方法 (__ 前缀)
2. 受保护属性 (_ 前缀)
3. 属性访问器 (property)
4. 类方法与静态方法 (@classmethod, @staticmethod)
5. 继承与方法重写
6. 运算符重载 (__str__, __len__, __getitem__ 等)
7. 多态与抽象类 (abc 模块)
8. 魔术方法 (__init__, __new__ 等)
"""
"""_:protected: 受保护属性,子类可以访问,但不建议直接访问
__ :private: 私有属性,只有类内部可以访问,子类和外部无法访问"""
from abc import ABC, abstractmethod
class Person:
"""演示类和基本实例方法"""
_species = "Human" # 受保护类属性
def __init__(self, name, age):
self.name = name
self.age = age
self.__bank_account = 1000 # 私有属性
def __secret_method(self):
return "This is private data."
def public_method(self):
"""
在类的内部可访问私有方法和属性
"""
return f"{self.name} says: {self.__secret_method()}"
@classmethod
#classmethod 是一个类方法,cls 是类本身
# 通过 cls 可以访问类属性和方法
# 类方法可以被类和实例调用
# 类方法通常用于工厂方法或访问类属性
def species_info(cls):
"""演示类方法"""
return f"All persons are {cls._species}."
def __str__(self):
"""演示魔术方法 __str__"""
"""返回友好的字符串表示"""
"""魔术方法是 Python 中特殊的方法,通常以双下划线开头和结尾"""
return f"Person(name={self.name}, age={self.age})"
class Student(Person):
"""演示继承与覆盖父类方法"""
def __init__(self, name, age, grade):
"""
初始化学生对象
:param name: 姓名
:param age: 年龄
:param grade: 年级
"""
# 调用父类的构造函数
super().__init__(name, age)
self.grade = grade
def __str__(self):
"""重写父类的 __str__ 方法"""
return f"Student(name={self.name}, age={self.age}, grade={self.grade})"
def study(self):
return f"{self.name} is studying in grade {self.grade}."
class Teacher(Person):
"""演示多态和属性访问器"""
def __init__(self, name, age, subject):
super().__init__(name, age)
self._subject = subject # 受保护属性
@property
def subject(self):
"""
演示属性访问器
"""
return self._subject
@subject.setter
#subject.setter 是一个属性设置器,用于设置受保护属性的值
def subject(self, value):
if value:
self._subject = value
def teach(self):
return f"{self.name} is teaching {self._subject}."
class Animal(ABC):
"""抽象类演示"""
@abstractmethod
#abstractmethod 是一个抽象方法,用于定义接口
# 抽象方法没有实现,子类必须实现这个方法
def make_sound(self):
"""抽象方法"""
pass
def move(self):
"""普通方法"""
return "The animal moves."
class Dog(Animal):
"""演示实现抽象类的子类"""
def __init__(self, name):
self.name = name
def make_sound(self):
return f"{self.name} says: Woof!"
class Car:
"""演示静态方法、类方法与运算符重载"""
def __init__(self, brand, model, year):
self.brand = brand
self.model = model
self.year = year
self._odometer = 0
@property
#property 是一个属性访问器,用于获取私有属性的值
# 属性访问器可以让我们以属性的方式访问方法
def odometer(self):
return self._odometer
@odometer.setter
#odometer.setter 是一个属性设置器,用于设置私有属性的值
def odometer(self, value):
if value >= self._odometer:
self._odometer = value
@classmethod
def vintage(cls):
"""演示类方法的用途"""
return cls("Retro", "Classic", 1970)
@staticmethod
#staticmethod 是一个静态方法,不需要访问类或实例属性
# 静态方法可以被类和实例调用
def beep():
return "Car horn: Beep!"
def drive(self, distance):
"""简单演示开车增程"""
self._odometer += distance
return f"Driving {distance} km. Odometer: {self._odometer} km."
def __len__(self):
"""魔术方法,示例性返回行驶总里程"""
return self._odometer
def __str__(self):
"""友好字符串表示"""
return f"Car({self.brand}, {self.model}, {self.year})"
def __add__(self, other):
"""
运算符重载示例:将两辆车的里程相加
返回新的 Car 对象
"""
new_odometer = self._odometer + other._odometer
combined_car = Car(self.brand + "&" + other.brand,
self.model + "&" + other.model,
min(self.year, other.year))
combined_car._odometer = new_odometer
return combined_car
# 测试 Person, Student, Teacher
p = Person("Alice", 30)
print(p)
print(p.public_method())
print(Person.species_info())
s = Student("Bob", 14, 8)
print(s)
print(s.study())
t = Teacher("Carol", 40, "Math")
print(t)
print(t.teach())
# 测试 Dog (抽象类的子类)
dog = Dog("Rex")
print(dog.make_sound())
print(dog.move())
# 测试 Car
car1 = Car("Toyota", "Corolla", 2020)
car2 = Car("Honda", "Civic", 2021)
print(car1.drive(100))
print(car2.drive(200))
print(Car.beep())
print(len(car1), len(car2))
vintage_car = Car.vintage()
print(vintage_car)
# 运算符重载 __add__
combined = car1 + car2
print(combined, len(combined))
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。