Python 类和实例详解

部署运行你感兴趣的模型镜像

Python 里的类和实例是面向对象编程(OOP)的核心,学好它们能让你写出更结构化、可维护的代码。

参考文章:Python 类和实例 | 简单一点学习 easyeasy.me

1. 什么是类和实例?

类(Class)就像一个蓝图,定义了一类东西的属性(数据)和行为(方法)。比如,“狗” 是一个类,描述了狗有哪些特征(比如名字、品种)和行为(比如叫、跑)。实例(Instance)是根据这个蓝图创建的具体对象,比如你家养的狗 “旺财” 就是一个实例。

现实世界的比喻:

  • 类 = 汽车的设计图(规定了汽车有轮子、引擎,能跑能刹车)。
  • 实例 = 一辆具体的汽车(比如你开的红色特斯拉)。

用代码看个简单例子:

# 定义一个类
class Dog:
    def bark(self):
        print("汪汪汪!")

# 创建实例
wangcai = Dog()
wangcai.bark()  # 输出:汪汪汪!

这里 Dog 是类,wangcai 是实例,bark 是方法。接下来我们一步步展开。


2. 定义一个类

类的基本语法

在 Python 里,定义类用 class 关键字,后面跟类名(通常首字母大写)。类里可以定义属性(数据)和方法(函数)。

class Dog:
    # 类属性(共享的)
    species = "Canis familiaris"

    # 初始化方法
    def __init__(self, name, age):
        # 实例属性
        self.name = name
        self.age = age

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

__init__self 的作用

  • __init__ 是类的构造方法,每次创建实例时都会自动调用,用来初始化实例的属性。
  • self 是实例自身的引用,Python 自动把调用方法的实例传给 self。比如 wangcai.bark() 里的 self 就是 wangcai
  • 实例属性(像 self.name)是每个实例独有的,存在实例里。
  • 类属性(像 species)是类本身的,实例共享。

属性(成员变量)

  • 实例属性:定义在 __init__ 里,用 self.xxx 表示,每个实例有自己的值。
  • 类属性:直接定义在类里,所有实例共享。

例子:

# 创建两个实例
wangcai = Dog("旺财", 3)
xiaohei = Dog("小黑", 2)

print(wangcai.name)  # 输出:旺财
print(xiaohei.name)  # 输出:小黑
print(wangcai.species)  # 输出:Canis familiaris
print(xiaohei.species)  # 输出:Canis familiaris

3. 创建和使用实例

实例化对象

用类名加括号来创建实例,括号里传入 __init__ 需要的参数(除了 self)。

# 实例化
wangcai = Dog("旺财", 3)

访问和修改实例属性

可以用点号(.)访问或修改实例的属性。

print(wangcai.name)  # 输出:旺财
wangcai.age = 4      # 修改年龄
print(wangcai.age)   # 输出:4

调用实例方法

实例方法通过实例调用,Python 自动把实例传给 self

wangcai.bark()  # 输出:旺财 说:汪汪汪!

可以给类加更多方法,比如描述狗狗的行为:

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

    def bark(self):
        print(f"{self.name} 说:汪汪汪!")

    def run(self):
        print(f"{self.name} 在跑!")

wangcai = Dog("旺财", 3)
wangcai.run()  # 输出:旺财 在跑!

4. 类方法和静态方法

除了实例方法,Python 还支持类方法静态方法,用装饰器定义。

@classmethod

  • 类方法用 @classmethod 装饰,第一个参数是类本身(通常叫 cls)。
  • 适合操作类属性或不需要实例的操作。
class Dog:
    species = "Canis familiaris"

    @classmethod
    def get_species(cls):
        return cls.species

print(Dog.get_species())  # 输出:Canis familiaris

@staticmethod

  • 静态方法用 @staticmethod 装饰,不需要 selfcls,就像普通函数,但属于类的命名空间。
  • 适合跟类相关的工具函数。
class Dog:
    @staticmethod
    def dog_years(age):
        return age * 7

print(Dog.dog_years(3))  # 输出:21

什么时候用?

  • 实例方法:需要访问实例属性或行为时(90% 的情况)。
  • 类方法:操作类属性或类相关的逻辑。
  • 静态方法:跟类相关但不需要访问类或实例的属性。

5. 继承和多态

类的继承机制

继承让一个类(子类)可以继承另一个类(父类)的属性和方法,复用代码。

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

    def eat(self):
        print(f"{self.name} 在吃东西")

class Dog(Animal):  # 继承 Animal
    def bark(self):
        print(f"{self.name} 说:汪汪汪!")

wangcai = Dog("旺财")
wangcai.eat()   # 输出:旺财 在吃东西
wangcai.bark()  # 输出:旺财 说:汪汪汪!

方法重写和多态

子类可以重写父类的方法,实现自己的逻辑,这叫多态

class Cat(Animal):
    def eat(self):  # 重写 eat 方法
        print(f"{self.name} 在优雅地吃鱼")

xiaohua = Cat("小花")
xiaohua.eat()  # 输出:小花 在优雅地吃鱼

super() 的用法

super() 调用父类的方法,常用在子类的 __init__ 或重写方法中。

class Dog(Animal):
    def __init__(self, name, age):
        super().__init__(name)  # 调用父类的 __init__
        self.age = age

    def eat(self):
        super().eat()  # 调用父类的 eat
        print(f"{self.name} 吃得很开心!")

wangcai = Dog("旺财", 3)
wangcai.eat()
# 输出:
# 旺财 在吃东西
# 旺财 吃得很开心!

6. 特殊方法(魔法方法)

魔法方法是 Python 里以双下划线开头和结尾的方法(像 __str__),可以自定义对象的行为。

常见的魔法方法

  • __str__:定义 print() 时的输出。
  • __repr__:定义对象的“开发者友好”表示,通常用于调试。
  • __len__:定义 len() 的行为。

例子:

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

    def __str__(self):
        return f"{self.name}{self.age}岁"

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

wangcai = Dog("旺财", 3)
print(wangcai)        # 输出:旺财,3岁
print(repr(wangcai))  # 输出:Dog(name='旺财', age=3)

自定义对象行为

可以用魔法方法让对象支持运算,比如 __add__

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

    def __add__(self, other):
        return self.energy + other.energy

wangcai = Dog("旺财", 10)
xiaohei = Dog("小黑", 20)
print(wangcai + xiaohei)  # 输出:30

7. 小结和实践建议

学完后怎么用

  • 组织代码:用类把相关的数据和行为打包,代码更清晰。
  • 复用代码:通过继承减少重复代码。
  • 模块化:把复杂逻辑拆分成类,方便维护。

常见误区和注意事项

  1. 别忘了 self:实例方法必须显式写 self 作为第一个参数。
  2. 类属性 vs 实例属性:类属性是共享的,改了会影响所有实例。
  3. 继承要谨慎:不要为了继承而继承,确认子类和父类有“是”关系(比如狗是动物)。
  4. 魔法方法别乱用:只在需要自定义行为时用,比如需要 print 好看点才写 __str__

您可能感兴趣的与本文相关的镜像

Python3.8

Python3.8

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值