Skip to content

面向对象编程

类与对象

类的定义与实例化

  • 是对象的蓝图,定义了对象的属性和行为。
  • 对象是类的实例,每个对象有独立的数据属性和方法。
python
# 定义一个类
class Person:
    # 类的构造方法,定义初始化属性
    def __init__(self, name, age):
        self.name = name
        self.age = age

    # 类的方法
    def greet(self):
        print(f"Hello, my name is {self.name} and I am {self.age} years old.")

# 实例化对象
p1 = Person("Alice", 25)
p1.greet()  # 输出: Hello, my name is Alice and I am 25 years old.

类的属性与方法

  • 属性: 类的变量,表示类的状态或数据。
  • 方法: 类的函数,定义类的行为或操作。
python
class Dog:
    # 类属性,所有实例共享
    species = "Canis Familiaris"
    
    def __init__(self, name, breed):
        # 实例属性,每个对象独有
        self.name = name
        self.breed = breed

    # 实例方法
    def bark(self):
        print(f"{self.name} is barking!")

dog1 = Dog("Buddy", "Golden Retriever")
dog2 = Dog("Max", "Bulldog")

# 访问属性
print(dog1.name, dog1.breed)  # 输出: Buddy Golden Retriever
print(dog2.species)  # 输出: Canis Familiaris

# 调用方法
dog1.bark()  # 输出: Buddy is barking!

类的继承

继承允许一个类继承另一个类的属性和方法,减少代码冗余,增加代码重用性。

单继承

python
# 父类
class Animal:
    def __init__(self, name):
        self.name = name

    def speak(self):
        print(f"{self.name} makes a sound.")

# 子类继承父类
class Dog(Animal):
    def speak(self):
        print(f"{self.name} barks.")  # 重写父类的方法

dog = Dog("Rex")
dog.speak()  # 输出: Rex barks.

多继承

Python 支持多继承,一个类可以继承多个父类。

python
class A:
    def method_a(self):
        print("Method from class A")

class B:
    def method_b(self):
        print("Method from class B")

# C类同时继承A和B类
class C(A, B):
    pass

c = C()
c.method_a()  # 输出: Method from class A
c.method_b()  # 输出: Method from class B

重写与多态

  • 重写: 子类可以重写父类中的方法,以便在子类中提供不同的功能。
  • 多态: 不同的类可以定义相同的方法名,而实际调用时会根据对象类型执行对应的方法。
python
class Bird:
    def speak(self):
        print("Chirp chirp")

class Dog(Animal):
    def speak(self):
        print(f"{self.name} barks.")

class Cat(Animal):
    def speak(self):
        print(f"{self.name} meows.")

# 多态:不同对象调用相同的方法
animals = [Dog("Rex"), Cat("Whiskers"), Bird()]

for animal in animals:
    animal.speak()

# 输出: 
# Rex barks.
# Whiskers meows.
# Chirp chirp

封装与访问控制

封装是将数据隐藏在对象内部,只允许通过特定的方式访问和修改。Python 通过属性的命名方式实现封装和访问控制:

  • 公有属性: 直接访问,不加下划线。
  • 受保护属性: 以单下划线开头,仅限类内部和子类访问。
  • 私有属性: 以双下划线开头,只能在类内部访问。
python
class Car:
    def __init__(self, brand, speed):
        self.brand = brand  # 公有属性
        self._speed = speed  # 受保护属性
        self.__fuel = 100  # 私有属性

    def show_fuel(self):
        return self.__fuel  # 内部可以访问私有属性

car = Car("Toyota", 120)

# 访问公有属性
print(car.brand)  # 输出: Toyota

# 访问受保护属性(不推荐)
print(car._speed)  # 输出: 120

# 无法直接访问私有属性
# print(car.__fuel)  # 会报错

# 通过方法访问私有属性
print(car.show_fuel())  # 输出: 100

类的高级特性

静态方法与类方法

  • 静态方法: 不依赖于类或实例,可以通过类名直接调用。使用 @staticmethod 装饰器定义。
  • 类方法: 只能访问类变量,而不能访问实例变量,使用 @classmethod 装饰器定义。
python
class Utility:
    @staticmethod
    def add(a, b):
        return a + b

    @classmethod
    def description(cls):
        return f"This is a utility class."

# 静态方法调用
print(Utility.add(5, 3))  # 输出: 8

# 类方法调用
print(Utility.description())  # 输出: This is a utility class.

魔术方法(Magic Methods)

魔术方法是以双下划线开头和结尾的特殊方法,它们定义了类的某些行为,例如对象的初始化、字符串表示等。

  • __init__: 初始化对象时调用的构造方法。
  • __del__: 对象被销毁时调用的析构方法。
  • __str__: 定义对象的字符串表示,用于 print() 等输出。
  • __repr__: 定义对象的官方字符串表示,用于调试。
python
class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def __str__(self):
        return f"Person(name={self.name}, age={self.age})"

    def __repr__(self):
        return f"Person('{self.name}', {self.age})"

# 创建对象
p = Person("Alice", 30)

# 调用__str__方法
print(p)  # 输出: Person(name=Alice, age=30)

# 调用__repr__方法
print(repr(p))  # 输出: Person('Alice', 30)

运算符重载

魔术方法还可以用来重载运算符,例如 +- 等。

python
class Vector:
    def __init__(self, x, y):
        self.x = x
        self.y = y

    # 重载加法运算符
    def __add__(self, other):
        return Vector(self.x + other.x, self.y + other.y)

    def __repr__(self):
        return f"Vector({self.x}, {self.y})"

v1 = Vector(1, 2)
v2 = Vector(3, 4)
v3 = v1 + v2  # 使用__add__方法
print(v3)  # 输出: Vector(4, 6)
编程洪同学服务平台是一个广泛收集编程相关内容和资源,旨在满足编程爱好者和专业开发人员的需求的网站。无论您是初学者还是经验丰富的开发者,都可以在这里找到有用的信息和资料,我们将助您提升编程技能和知识。
专业开发
高端定制
售后无忧
站内资源均为本站制作或收集于互联网等平台,如有侵权,请第一时间联系本站,敬请谅解!本站资源仅限于学习与参考,严禁用于各种非法活动,否则后果自行负责,本站概不承担!