Python面向对象

一、基础概念

1. 类(Class)

类是抽象的模板,用于定义对象的结构和行为。它包含属性(变量)和方法(函数)。类的作用是作为创建对象的蓝图,定义了对象的属性和行为。

2. 对象(Object)/ 实例(Instance)

对象是类的实例化结果,是具体的实体。类是对象的模板,而对象是类的具体实例。

示例

class Car:
    def __init__(self, brand, color):
        self.brand = brand
        self.color = color

my_car = Car("Toyota", "Red")  # my_car 是 Car 类的实例

二、核心特性

1. 封装(Encapsulation)

封装是将数据(属性)和操作数据的方法封装到一个类中,隐藏内部实现细节,只暴露必要的接口。封装的优点包括提高代码的安全性和降低代码的复杂性。

示例

class BankAccount:
    def __init__(self, balance):
        self.__balance = balance  # 私有属性

    def deposit(self, amount):
        self.__balance += amount

    def withdraw(self, amount):
        if amount <= self.__balance:
            self.__balance -= amount
        else:
            print("Insufficient funds")

    def get_balance(self):
        return self.__balance

2. 继承(Inheritance)

继承允许一个类(子类)继承另一个类(父类)的属性和方法。继承的优点是代码复用和层次结构清晰。

示例

class Animal:
    def __init__(self, name):
        self.name = name

    def speak(self):
        pass

class Dog(Animal):
    def speak(self):
        return f"{self.name} says Woof!"

my_dog = Dog("Buddy")
print(my_dog.speak())  # 输出: Buddy says Woof!

3. 多态(Polymorphism)

多态允许不同的对象对同一消息做出响应,即同一个接口可以被不同的底层实现所使用。多态的实现方式包括方法重写(Override)和方法重载(Overload)。

示例

class Shape:
    def area(self):
        pass

class Rectangle(Shape):
    def __init__(self, width, height):
        self.width = width
        self.height = height

    def area(self):
        return self.width * self.height

class Circle(Shape):
    def __init__(self, radius):
        self.radius = radius

    def area(self):
        return 3.14 * self.radius ** 2

shapes = [Rectangle(4, 5), Circle(3)]
for shape in shapes:
    print(shape.area())  # 多态:调用不同的 area 方法

三、魔法方法(Magic Methods)

魔法方法是 Python 中以双下划线开头和结尾的特殊方法,用于实现特定的功能。

1. 初始化与字符串表示

  • __init__:初始化对象属性。

  • __str__:定义对象的字符串表示。

示例

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})"

2. 数学比较方法

这些方法用于实现对象之间的比较。

  • __eq__:等于(==)

  • __ne__:不等于(!=)

  • __gt__:大于(>)

  • __ge__:大于等于(>=)

  • __lt__:小于(<)

  • __le__:小于等于(<=)

示例

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 __eq__(self, other):
        return self.age == other.age

    def __ge__(self, other):
        return self.age >= other.age

    def __le__(self, other):
        return self.age <= other.age

    def __ne__(self, other):
        return self.age != other.age

    def __gt__(self, other):
        return self.age > other.age

    def __lt__(self, other):
        return self.age < other.age

3. 长度魔法方法

  • __len__:返回对象的长度。

示例

class MyList:
    def __init__(self, elements):
        self.elements = elements

    def __len__(self):
        return len(self.elements)

my_list = MyList([1, 2, 3, 4])
print(len(my_list))  # 输出:4

4. 构造函数

  • __new__:构造函数,用于创建对象。

示例

class Singleton:
    _instance = None

    def __new__(cls):
        if cls._instance is None:
            cls._instance = super().__new__(cls)
        return cls._instance

obj1 = Singleton()
obj2 = Singleton()
print(obj1 is obj2)  # 输出:True

5. 析构函数

  • __del__:析构函数,用于释放对象的资源。

示例

class File:
    def __init__(self, filename):
        self.filename = filename
        self.file = open(filename, "w")

    def __del__(self):
        self.file.close()
        print(f"File {self.filename} closed")

file = File("test.txt")
del file  # 输出:File test.txt closed

6. 上下文管理

  • __enter____exit__:实现资源自动管理。

示例

class File:
    def __init__(self, filename, mode):
        self.filename = filename
        self.mode = mode

    def __enter__(self):
        self.file = open(self.filename, self.mode)
        return self.file

    def __exit__(self, exc_type, exc_val, exc_tb):
        self.file.close()

with File("test.txt", "w") as f:
    f.write("Hello, World!")

四、类的成员

类的成员包括属性(变量)和方法(函数)。这些成员可以分为以下几类:

1. 属性

  • 实例属性:属于某个实例,每个实例独立。

  • 类属性:属于类本身,所有实例共享。

2. 方法

  • 实例方法:需要实例化对象后调用。

  • 类方法:使用 @classmethod 装饰器,第一个参数为类本身(cls)。

  • 静态方法:使用 @staticmethod 装饰器,不绑定类或实例。

五、动态添加类成员

可以在类的外部动态地为类或实例添加属性或方法。

1. 动态添加实例属性

示例

class Person:
    def __init__(self, name):
        self.name = name

person = Person("Alice")
person.age = 30  # 动态添加实例属性
print(person.age)  # 输出:30

2. 动态添加类属性

示例

class Person:
    def __init__(self, name):
        self.name = name

Person.species = "Homo sapiens"  # 动态添加类属性
print(Person.species)  # 输出:Homo sapiens
print(person.species)  # 输出:Homo sapiens

3. 动态添加方法

示例

class Person:
    def __init__(self, name):
        self.name = name

def greet(self):
    return f"Hello, my name is {self.name}!"

Person.greet = greet  # 动态添加实例方法
person = Person("Alice")
print(person.greet())  # 输出:Hello, my name is Alice!

六、属性封装

封装是面向对象的核心特性之一,通过封装可以隐藏类的内部实现细节,只暴露必要的接口。

1. 私有属性

在 Python 中,使用双下划线(__)前缀表示私有属性,这些属性不能直接从外部访问。

2. 使用 @property 装饰器

可以通过 @property 装饰器定义只读属性,或者通过 @<property_name>.setter 提供属性的设置方法。

示例

class Person:
    def __init__(self, name, age):
        self.__name = name  # 私有属性
        self.__age = age    # 私有属性

    @property
    def name(self):
        return self.__name

    @name.setter
    def name(self, value):
        if not value:
            raise ValueError("Name cannot be empty")
        self.__name = value

    @property
    def age(self):
        return self.__age

    @age.setter
    def age(self, value):
        if value < 0:
            raise ValueError("Age cannot be negative")
        self.__age = value

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

# 使用封装的属性
person = Person("Alice", 30)
print(person.name)  # 输出:Alice
person.name = "Bob"  # 修改属性
print(person)  # 输出:Person(name=Bob, age=30)

七、单例模式

单例模式是一种设计模式,确保一个类只有一个实例,并提供一个全局访问点。

1. 使用 __new__ 方法实现单例

示例

class Singleton:
    _instance = None

    def __new__(cls):
        if cls._instance is None:
            cls._instance = super(Singleton, cls).__new__(cls)
        return cls._instance

singleton1 = Singleton()
singleton2 = Singleton()
print(singleton1 is singleton2)  # 输出:True

2. 使用装饰器实现单例

示例

def singleton(cls):
    instances = {}

    def get_instance(*args, **kwargs):
        if cls not in instances:
            instances[cls] = cls(*args, **kwargs)
        return instances[cls]

    return get_instance

@singleton
class MyClass:
    def __init__(self, value):
        self.value = value

obj1 = MyClass(10)
obj2 = MyClass(20)
print(obj1 is obj2)  # 输出:True
print(obj1.value)  # 输出:10

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值