Python 面向对象编程基础-类的创建与__init__实例化

Python 面向对象编程基础

面向对象编程(OOP)是现代编程语言中的一种重要编程范式,它通过类和对象来组织代码,提高代码的可重用性可维护性。Python是完全支持面向对象编程的语言,它通过类和对象来帮助程序员设计更加模块化和可扩展的代码。

可以理解为:你正在设计一个动物园。你不仅仅是列出动物的名字、年龄、体重等信息,还要给它们设定它们的行为,比如吃饭、走路、叫声等等。面向对象编程就像是你把每个动物视为一个独立的实体,而这个实体有自己的数据和行为,互相独立但又可以互动

可通过此图增加印象:

为什么要学习面向对象?

学习面向对象编程的原因如下:

  1. 提高代码重用性:面向对象可以通过继承和多态等机制,避免重复编写相似的代码。通过设计合理的类和方法,程序员可以轻松重用已有的代码,而不必每次都从头开始。
  2. 增强代码可维护性:面向对象通过将数据和方法封装到类中,减少了程序各部分之间的依赖,方便修改和扩展。即使项目不断增加功能,修改也会更加集中和有条理。
  3. 更好的代码组织结构:当项目规模增大时,面向对象能够将复杂的系统拆解为更小、更易管理的模块,每个类负责自己的功能,简化了开发过程。
  4. 更贴近现实世界的建模方式:面向对象编程通过类和对象的概念,可以模拟现实世界中的事物和关系,让开发者可以更加自然地描述问题并解决问题。

面向对象编程中的三个重要概念

1. 类的定义

类是面向对象编程中的核心概念之一,它定义了对象的属性和行为。类是创建对象的模板,通过定义类,我们能够创建具有相同属性和方法的多个对象。

2. 什么是类(Class)?

类就像是"动物"的设计图。在现实世界中,不同的动物都有不同的特征和行为,但它们都符合一个基本的模板(比如都是动物)。这个模板就是类,它定义了动物的特征(属性)和行为(方法)。

  • 类就像动物的设计蓝图,比如你设计一份"狗"的蓝图,决定了它有"名字"、"年龄"这些属性,以及"吃饭"、"跑步"等行为。这个蓝图可以用来创建很多不同的狗对象。

3. 什么是对象(Object)?

对象是类的实际体现,是根据类的蓝图创建出来的"具体动物"。每一只狗对象都有自己的名字和年龄,可以吃饭、跑步等。每个对象的属性可以不同,但它们都遵循类定义的规则。 \

  • 对象就是按照设计图制造的具体狗,比如你按照"狗"的蓝图制造一只名叫"旺财"的狗,它有自己的名字和年龄。你可以有很多只狗对象,每只狗都是独立的个体,但它们都符合蓝图。

4. 如何创建一个类?

在Python中,类就像我们为动物设计的蓝图。你通过 class 来定义这个蓝图。

  • 创建类就像你画出一份狗的设计图,你决定了狗的"属性"(如名字、年龄)和"行为"(如吃饭、跑步)。然后你可以用这个设计图来制造无数只不同的狗。

类名的命名规则

  • 类名首字母大写,多个单词之间采用驼峰原则
  • 实例名、模块名采用小写,多个单词之间采用下划线隔开

创建类的语法:

python 复制代码
class 类名:
    类属性名1=类属性值1 (可以参考变量)
    类属性名2=类属性值2 (可以无限创建属性)
    
    def 类方法(参数):  #可以参考函数
        #类方法代码
    
     #类方法2  可以定义多个方法
     def 类方法(参数):  #可以参考函数
        #类方法代码
        
#调用类
类名()

#调用类下面的方法(可以理解为调用类下面的函数)
类名().方法名()
示例代码:
python 复制代码
class Dog:  #创建类为 Dog
    legs = 4  # 类属性1

    def return_legs(self):  # 实例方法
        print(f"正常的狗都有{Dog.legs}条腿!")
        
    def return_updata(self):  # 实例方法
        print(f"我家的旺柴有{Dog.legs}条腿!")

s1=Dog() #创建了一个 `Dog` 类的实例。通过 `s1`,我们可以访问 `Dog` 类的方法和属性
print(s1) #输出的是该对象的内存地址

#调用了 `Dog` 类的实例方法,通过 `self` 访问了类属性 `legs`,并打印了相关信息
s1.return_legs()
s1.return_updata()

输出示例:

csharp 复制代码
<__main__.Dog object at 0x000001DF510A0160>
正常的狗都有4条腿!
我家的旺柴有4条腿!
解释
  • 创建了一个名为Dog的类,他的类属性有name和age,还创建了return_legsreturn_updata方法,都在方法里面调用类属性name并输出,然后实例化Dog类以及调用类方法

  • <__main__.Dog object at 0x000001DF510A0160> :这是打印 s1 对象的默认输出,表示对象的内存地址。它告诉你 s1 是一个 Dog 类的实例

PS:改类属性 legs 后,所有方法里面的 legs 属性值都会改变

如何理解 self

  • self 其实是方法内部的一个"指针",它指向调用该方法的实例对象。所以每个方法的第一个参数 self 都表示当前对象本身
  • 你可以把它看作是一个占位符,具体名称并不重要,通常使用 self 是约定俗成的做法。

为什么要加 self

  • 引用当前实例self 代表了当前对象本身。它使得你能够在类的方法内部访问和操作该对象的属性和其他方法。
  • 每个实例方法都必须有 self,这样才能确保每个对象有自己的独立状态。

如果不加 self 会怎么样?

如果你在实例方法中不加 self,Python 会报错。 这是因为方法定义时,第一个参数必须是 self,以告诉 Python 这个方法是绑定到对象实例上的


5.创建类的实例属性:

他和类属性有什么区别?
  • 类属性:类属性是属于整个类的,所有实例共享该属性。它在类中定义,所有实例对象都能访问。
  • 实例属性 :实例属性是通过 __init__ 方法创建的,每个实例都有独立的属性值。__init__ 方法在实例化对象时自动调用,用来初始化对象的状态
类属性与实例属性的比较
属性类型 定义位置 共享性 初始化方式 内存消耗 适用场景
类属性 类体内定义 所有实例共享 直接在类体内定义 内存节省 适用于所有实例共享的数据(如常量、默认配置)
实例属性 __init__ 方法中定义 每个实例独立拥有 __init__ 方法中定义 增加内存消耗 适用于每个实例独特的数据(如对象的状态)
可以理解比喻为:
属性类型 比喻 适用场景
类属性 狗的的腿和耳朵数量(所有狗狗共享) 所有实例共享的数据,比如常量、默认设置等。
实例属性 每个狗狗的名字、年龄(所有狗狗独立) 每个实例需要独立数据和状态的场景,比如个性化的对象数据。

实例属性可以理解为类属性,只是独立还是共享的区别

创建实例属性语法
python 复制代码
class 类名:
    # 类属性 可以理解为创建变量
    类属性名1 = 类属性值1
    类属性名2 = 类属性值2
    
    # 构造方法(初始化方法)
    def __init__(self, 参数1, 参数2):
        # 实例属性 可以理解为创建变量
        self.实例属性1 = 参数1
        self.实例属性2 = 参数2
    
    # 类方法1  可以理解为创建函数 但是这里是在类下面创建,所以叫方法
    def 方法名1(self):
        # 类方法代码
        print(f"方法1执行,{self.实例属性1} 和 {self.实例属性2}")
    
    # 类方法2
    def 方法名2(self):
        # 类方法代码
        print("方法2执行")

# 创建类的实例(对象)
obj = 类名(参数1, 参数2)  # 传递必要的参数给构造方法

# 调用类的方法
obj.方法1()  # 调用方法1
obj.方法2()  # 调用方法2
示例代码:
python 复制代码
class Dog:
    # 类属性:所有狗狗共享的属性
    legs = 4  # 正常狗狗的腿数都一样 四条腿
    
    def __init__(self, name, breed):
        # 实例属性:每只狗独有的属性
        self.name = name  # 每只狗的名字
        self.breed = breed  # 每只狗的品种

# 创建两只不同的狗对象
dog1 = Dog("旺柴", "拉布拉多")
dog2 = Dog("小白", "吉娃娃")

# 访问类属性
print(dog1.legs)  # 输出 4
print(dog2.legs)  # 输出 4

# 访问实例属性
print(dog1.name)  # 输出 旺柴
print(dog2.name)  # 输出 小白

# 修改类属性
Dog.legs = 3
print(dog1.legs)  # 输出 3
print(dog2.legs)  # 输出 3

# 修改实例属性
dog1.name = "大黄"
print(dog1.name)  # 输出 大黄
print(dog2.name)  # 输出 小白

解释:

  1. 类属性 (legs)
python 复制代码
legs = 4  # 正常狗狗的腿数都一样 四条腿
  • 所有的狗狗共享同样的腿数,这里假设每只狗的腿数都是 4。类属性是所有对象共享的,所以修改了类属性后,所有对象都会受到影响。
  1. 实例属性 (namebreed)
python 复制代码
    def __init__(self, name, breed):
        # 实例属性:每只狗独有的属性
        self.name = name  # 每只狗的名字
        self.breed = breed  # 每只狗的品种
  • 每只狗狗的名字和品种是独特的,这些是通过 __init__ 方法在对象创建时传入并设置的。
  • _init__ 方法在 Python 中被称为构造方法(Constructor),它是一个特殊的方法,用于在创建对象时初始化对象的属性
  1. 类的实例化(创建狗狗对象)
python 复制代码
dog1 = Dog("旺柴", "拉布拉多") 
dog2 = Dog("小白", "吉娃娃")
  • dog1dog2 是两只不同的狗,分别有不同的名字和品种。
  1. 访问类属性和实例属性
python 复制代码
# 访问类属性
print(dog1.legs)  # 输出 4
print(dog2.legs)  # 输出 4

#访问实例属性
print(dog1.name)  # 输出 旺柴
print(dog2.name)  # 输出 小白
  • dog1.legsdog2.legs 输出的是类属性 legs 的值,默认是 4。
  • dog1.namedog2.name 输出的是每只狗的实例属性 name
  1. 修改类属性和实例属性
python 复制代码
# 修改实例属性
dog1.name = "大黄"
print(dog1.name)  # 输出 大黄
print(dog2.name)  # 输出 小白
  • 修改类属性 legs 后,所有狗对象的 legs 属性都会改变。
  • 修改实例属性 dog1.name 后,只有 dog1 的名字会改变,dog2 的名字保持不变。

总结

本文以动物园管理 为生动比喻,系统讲解Python面向对象编程(OOP)核心概念,包括类与对象的定义、类属性实例属性的区别、self关键字的原理及实际应用场景。通过代码示例与类比教学,帮助初学者快速掌握OOP的封装、继承思想,提升代码复用性与可维护性,为开发复杂项目奠定基础。

相关推荐
2501_915374351 小时前
LangChain自动化工作流实战教程:从任务编排到智能决策
python·langchain·自动化
chilavert3183 小时前
深入剖析AI大模型:Prompt 开发工具与Python API 调用与技术融合
人工智能·python·prompt
Mallow Flowers4 小时前
Python训练营-Day31-文件的拆分和使用
开发语言·人工智能·python·算法·机器学习
蓝婷儿5 小时前
Python 爬虫入门 Day 2 - HTML解析入门(使用 BeautifulSoup)
爬虫·python·html
struggle20255 小时前
Burn 开源程序是下一代深度学习框架,在灵活性、效率和可移植性方面毫不妥协
人工智能·python·深度学习·rust
腾飞开源5 小时前
17_Flask部署到网络服务器
python·flask·python web开发·flask快速入门教程·flask框架·flask视频教程·flask会话技术
Mikhail_G6 小时前
Python应用八股文
大数据·运维·开发语言·python·数据分析
mikes zhang6 小时前
Flask文件上传与异常处理完全指南
后端·python·flask
烛阴6 小时前
深入浅出地理解Python元类【从入门到精通】
前端·python
weixin_464078077 小时前
Python学习小结
python·学习