一文掌握python面向对象

本文详细介绍了Python的面向对象编程,包括基础概念如类、对象、实例变量、类变量、构造方法、实例方法、类方法和静态方法,以及封装、继承和多态等进阶特性。通过实例演示了如何使用getter、setter和property,如何重写方法,以及如何实现多重继承和多态。文章强调了Python中的鸭子类型和类型检查在多态中的作用,并指出所有Python类都隐式继承自object类。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

面向对象编程(Object-Oriented Programming,简称OOP)是一种重要的编程范式,它将现实世界的问题抽象成类和对象,通过封装、继承和多态等特性实现程序设计的模块化与灵活性。Python作为一门支持OOP的高级语言,其面向对象的特性使得代码更加简洁、易读且易于维护。本文旨在全面解析Python面向对象编程的概念,并结合实例演示其在实际开发中的应用。

面向对象思想有三个基本特性:封装性、继承性、多态性。

目录

一、Python面向对象基础概念

1. 类(Class) 

2. 对象(Object) 

3. 实例变量

4. 类变量

5. 构造方法

6. 实例方法

7. 类方法

8. 静态方法

9.什么时候用实例方法,什么时候用类方法,什么时候用静态方法

        1)实例方法(Instance Method)

        2)类方法(Class Method)

        3)静态方法(Static Method)

10. getter、setter和property

二、Python面向对象进阶特性

1. 封装(Encapsulation) 

        1)私有变量

        2)私有方法

        3)定义属性

        1).定义类属性(在类定义中定义,对所有实例共享)

        2).定义实例属性(在 __init__ 方法或其他实例方法中定义,每个实例独有):

        3).使用@property装饰器定义属性(用于实现属性的getter和setter方法,实现属性访问控制和验证):

2.继承(Inheritance) 继承允许我们基于已存在的类创建新的类,新类称为子类或派生类,原有的类称为基类或父类。子类自动拥有父类的所有属性和方法,同时可以添加新的属性和方法或者重写父类的方法。示例:

1)重写方法(Override), 指在一个子类中重新定义父类的方法

2)多重继承,允许一个子类同时继承多个父类的属性和方法。

3)实例

3.多态(Polymorphism) 在面向对象编程中,多态是指允许不同类的对象对同一消息作出响应的能力。简单地说,同一个接口,不同的实现,即一个接口,多种方法。在 Python 中,多态通常是通过方法重写(Override)和接口(抽象基类或协议)实现的。

        1)类型检查

        2)鸭子类型

4.python根类:object


一、Python面向对象基础概念

1. 类(Class) 

类是具有相同属性和方法的一组对象的蓝图或模板。在Python中定义一个类,使用关键字class,例如:

class Dog:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def bark(self):
        print('Woof Woof!')

上述代码定义了一个名为Dog的类,它有两个属性(name和age)和一个方法(bark)。

2. 对象(Object) 

对象是类的实例,由类创建而来。如创建一个Dog对象:

my_dog = Dog('Bingo', 3)

3. 实例变量

实例变量通常是在类的方法中通过self关键字来实现的。self是一个指向当前实例本身的引用,所以当你在类的方法中声明一个变量并将其绑定到self上时,这个变量就成为了该实例的属性。

class MyClass:
    def __init__(self, instance_var):
        self.instance_var = instance_var

# 创建类的两个不同实例
obj1 = MyClass("Value for obj1")
obj2 = MyClass("Value for obj2")

# 每个实例的instance_var变量是独立的
print(obj1.instance_var)  # 输出: Value for obj1
print(obj2.instance_var)  # 输出: Value for obj2

4. 类变量

类变量是属于整个类(而不是单个实例)并且所有实例共享的变量。它们在类内部定义且不使用self关键字进行绑定。如果需要为所有实例共享同一份数据,则应使用类变量。

class MyClass:
    class_var = "Shared by all instances"

    def __init__(self):
        pass

# 所有实例都共享同样的类变量
print(MyClass.class_var)  # 输出: Shared by all instances
obj1 = MyClass()
print(obj1.class_var)  # 输出: Shared by all instances
obj2 = MyClass()
obj2.class_var = "New value"
print(MyClass.class_var)  # 输出: New value,因为在这里实际上是修改了类变量而非实例变量
print(obj1.class_var)  # 输出: New value,可以看到这里也被修改了,因为类变量是共享的

5. 构造方法

构造方法在Python中被称为__init__方法,它是类的一个特殊方法,当创建一个类的新实例时会自动调用。构造方法的主要作用是初始化对象的状态(即设置对象的属性值)。

class MyClass:
    class_var = "Shared by all instances"

    def __init__(self):
        pass

# 所有实例都共享同样的类变量
print(MyClass.class_var)  # 输出: Shared by all instances
obj1 = MyClass()
print(obj1.class_var)  # 输出: Shared by all instances
obj2 = MyClass()
obj2.class_var = "New value"
print(MyClass.class_var)  # 输出: New value,因为在这里实际上是修改了类变量而非实例变量
print(obj1.class_var)  # 输出: New value,可以看到这里也被修改了,因为类变量是共享的

在这个例子中,__init__方法接收两个参数arg1arg2,并使用self.arg1self.arg2将它们绑定为实例的属性。这意味着每个由MyClass创建的新实例都会拥有自己的arg1arg2属性,并且这些属性的初始值是在创建实例时通过构造方法传入的参数确定的。

构造方法并非必须定义,但通常为了初始化对象状态或执行某些必要的设置操作,我们会在定义类时提供__init__方法。

6. 实例方法

实例方法是面向对象编程中定义在类内部,可以访问并操作该类实例属性的方法。在Python中,实例方法的第一个参数通常是self,它是一个指向调用该方法的实例本身的引用。

class Dog:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    # 这是一个实例方法
    def bark(self):
        print(f'{self.name} says Woof!')

# 创建Dog类的一个实例
my_dog = Dog('Bingo', 3)

# 调用实例方法bark()
my_dog.bark()  # 输出: Bingo says Woof!

在这个例子中,bark就是一个实例方法,它通过self.name访问和使用了当前实例(即my_dog)的name属性。当我们在实例my_dog上调用bark()方法时,Python会自动将my_dog这个实例作为第一个参数传递给bark方法,并绑定到self上,使得方法内部可以访问和操作实例的属性。

7. 类方法

类方法是面向对象编程中另一种特殊类型的方法,它与实例方法不同之处在于,类方法与类相关联而不是类的实例,并且通过@classmethod装饰器来标识。在类方法内部,第一个参数通常是cls(代表class),而非self,并且类方法可以操作和修改类变量或创建新的类实例,而无需事先创建任何实例。

class Dog:
    species = 'Canine'  # 这是一个类变量

    def __init__(self, name, age):
        self.name = name
        self.age = age

    # 类方法
    @classmethod
    def create_dog(cls, name, age):
        new_dog = cls(name, age)
        return new_dog

# 调用类方法创建Dog类的一个实例
new_pup = Dog.create_dog('Max', 1)

# 输出新创建的实例
print(new_pup.name)  # 输出: Max
print(new_pup.age)   # 输出: 1

# 访问并修改类变量
print(Dog.species)  # 输出: Canine
Dog.species = 'Domestic Dog'
print(Dog.species)  # 输出: Domestic Dog

在这个例子中,create_dog是一个类方法,其内部使用cls来创建一个新实例。这意味着无论何时何地调用这个方法,它都会根据传入的参数返回一个新的Dog类的实例,而不需要已经存在一个Dog实例来调用它。同时,类方法也可以访问和修改类变量,如species

8. 静态方法

静态方法在Python中通过@staticmethod装饰器定义,它与类或实例无关,不需要访问任何实例变量或类变量。静态方法就像一个独立的函数,只是逻辑上组织在某个类内部。

class MathUtils:
    @staticmethod
    def add_numbers(a, b):
        return a + b

# 调用静态方法,无需创建类的实例
result = MathUtils.add_numbers(3, 5)
print(result)  # 输出: 8

在这个例子中,add_numbers是一个静态方法,它不依赖于MathUtils类的任何状态。我们直接通过类名调用这个方法,而不是通过类的实例。静态方法通常用于提供一些通用的功能,这些功能和类本身的核心逻辑没有紧密联系,但又因为某种逻辑关系(例如工具方法、辅助计算等)而被包含在类中。

9.什么时候用实例方法,什么时候用类方法,什么时候用静态方法

        1)实例方法(Instance Method)
  • 何时使用:
    • 当你需要操作或访问与特定对象相关的属性时,应使用实例方法。
    • 实例方法通常包含self作为第一个参数,通过它来引用调用该方法的实例本身,并且可以修改或利用实例的状态。
class Dog:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    # 实例方法
    def bark(self):
        print(f'{self.name} says Woof!')

# 创建一个Dog实例并调用实例方法
my_dog = Dog('Bingo', 3)
my_dog.bark()  # Bingo says Woof!

在这个例子中,bark方法是一个实例方法,因为它需要知道当前是哪个狗在叫,这依赖于每个狗实例的name属性。


        2)类方法(Class Method)<
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值