当前位置: 首页 > article >正文

8.Python 面向对象(类和对象):定义类、类的构成、类的__init__()方法、创建对象、理解self

Python 是一种面向对象的编程语言,面向对象编程(OOP)允许我们通过“类”来组织代码,实现封装、继承和多态。

1. 定义类

在 Python 中,类是通过 class 关键字定义的。类定义中包含了属性(成员变量)和方法(成员函数)。类的定义通常以 class 关键字开头。

class Dog:
    pass  # 空类

2. 类的构成

类主要由两部分构成:

  • 属性(成员变量):存储对象的数据。
  • 方法(成员函数):定义类的行为,操作对象的数据。
class Dog:
    # 属性
    species = "Canis familiaris"  # 类属性

    # 方法
    def __init__(self, name, age):
        # 实例属性
        self.name = name
        self.age = age
    
    def bark(self):
        return f"{self.name} says Woof!"
  • 类属性:属于整个类,而不是单个实例对象。类属性对所有实例对象共享。
  • 实例属性:属于具体的实例对象,每个实例都有独立的属性。
  • 方法:函数属于类,它们可以访问类的属性,进行具体的操作。

3. __init__() 方法

__init__() 方法是类的构造方法,在创建对象时自动调用。它用于初始化对象的属性。每次创建对象时,__init__() 方法都会被执行。

class Dog:
    def __init__(self, name, age):
        self.name = name  # 实例属性
        self.age = age  # 实例属性
  • __init__() 是一个特殊方法,作为初始化方法,它接收至少一个参数(self),并且一般用于初始化对象的属性。
  • self 是一个指向实例对象的引用,表示当前正在创建的对象。

4. 创建对象

要创建一个对象,我们只需通过类名并传递相应的参数来调用类的构造函数 __init__()

my_dog = Dog("Buddy", 3)  # 创建对象,并传递参数
print(my_dog.name)  # 输出:Buddy
print(my_dog.age)   # 输出:3
  • my_dog 是一个对象,它是 Dog 类的实例。
  • my_dog.namemy_dog.age 分别是 Dog 类的实例属性。

5. 理解 self

在类定义中的方法中,self 是必须的,并且表示当前对象的实例。在方法被调用时,self 会自动指向调用该方法的对象实例,允许方法访问该对象的属性和其他方法。

class Dog:
    def __init__(self, name, age):
        self.name = name  # 设置实例属性
        self.age = age  # 设置实例属性

    def description(self):
        # 访问实例属性
        return f"{self.name} is {self.age} years old."
    
    def speak(self, sound):
        # 访问实例属性并执行方法
        return f"{self.name} says {sound}"
my_dog = Dog("Buddy", 3)
print(my_dog.description())  # 输出:Buddy is 3 years old.
print(my_dog.speak("Woof"))  # 输出:Buddy says Woof
  • self 使得方法能够访问该实例的属性和其他方法。
  • my_dog.description() 调用时,self 被自动赋值为 my_dog 对象,方法可以访问 my_dognameage 属性。

6. 类的继承

继承是面向对象编程中的一个重要概念,它允许我们创建一个类,并从另一个类继承属性和方法。

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

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

class Dog(Animal):  # 继承自Animal类
    def speak(self):
        return f"{self.name} barks."

my_dog = Dog("Buddy")
print(my_dog.speak())  # 输出:Buddy barks.
  • Dog 类继承了 Animal 类的 name 属性和 __init__ 方法,同时也重写了 speak() 方法。

7. 类的封装

封装是将对象的状态(属性)和行为(方法)包装在一起,并且控制外部代码访问对象内部的实现细节。可以通过属性前加双下划线(__)来实现私有化,使外部无法直接访问。

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

    def get_age(self):
        return self.__age  # 提供一个方法来访问私有属性

    def set_age(self, age):
        if age > 0:
            self.__age = age
        else:
            print("Age must be positive.")
my_dog = Dog("Buddy", 3)
print(my_dog.get_age())  # 输出:3
my_dog.set_age(4)  # 设置新年龄
print(my_dog.get_age())  # 输出:4
  • __age 是私有属性,不能直接从外部访问。
  • get_age()set_age() 方法是公开的,可以访问和修改私有属性。

总结

  1. 定义类:通过 class 关键字定义类,类包含属性和方法。
  2. __init__() 方法:构造函数,初始化对象的属性,self 指代当前对象。
  3. 创建对象:通过类名调用构造方法创建实例。
  4. self:指代当前对象的实例,允许访问实例的属性和方法。
  5. 继承:子类可以继承父类的属性和方法,且可以重写父类方法。
  6. 封装:通过将属性设为私有(双下划线)来保护对象内部数据,并通过公开方法访问。

http://www.kler.cn/a/539287.html

相关文章:

  • C++20新特性
  • 企业级Mysql实战
  • 分析模式应用――帐务模式02
  • 解决基于FastAPI Swagger UI的文档打不开的问题
  • 面试真题 | Momenta c++
  • 【SQL】count(1)、count() 与 count(列名) 的区别
  • 【PGCCC】在 PostgreSQL 上使用 pg_hint_plan替换 Oracle Hints 的最佳实践
  • 采用DDNS-GO与cloudflare实现双域名同时访问NAS
  • (done) openMP学习 (Day13: 线程私有数据和如何支持库(Pi again),蒙特卡洛计算 Pi,线性同余法)
  • [图文]DeepSeek能做对《软件方法》的测试题吗?
  • python基础入门:4.4模块与包管理
  • SqlSugar简单使用之Nuget包封装-Easy.SqlSugar.Core
  • python pyaudio使用调用本地麦克风获取音频
  • Git仓库托管基本使用05——远程仓库操作
  • k8s证书过期怎么更新?
  • Activity相关学习(二)
  • mmap 文件映射
  • 【C编程问题集中营】使用数组指针时容易踩得坑
  • 单片机之基本元器件的工作原理
  • 4.寻找两个正序数组的中位数
  • PAT乙级真题 — 1074 宇宙无敌加法器(java)
  • 降低获客与裂变渠道成本的新策略:融合开源2+1链动模式、AI智能名片与S2B2C商城小程序
  • Linux 创建进程 fork()、vfork() 与进程管理
  • python基础入门:3.5实战:词频统计工具
  • 问卷数据分析|SPSS之分类变量描述性统计
  • 深入浅出:SSL证书的作用与重要性