Python面向对象编程:创建类与__init__实例化详解

Python 面向对象编程基础

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

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

可通过此图增加印象:

为什么要学习面向对象?

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

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

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

1. 类的定义

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

2. 什么是类(Class)?

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

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

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

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

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

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

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

  • 创建类的语法:

    class 类名:
        类属性名1=类属性值1 (可以参考变量)
        类属性名2=类属性值2 (可以无限创建属性)
        
        def 类方法(参数):  #可以参考函数
            #类方法代码
        
         #类方法2  可以定义多个方法
         def 类方法(参数):  #可以参考函数
            #类方法代码
            
    #调用类
    类名()
    
    #调用类下面的方法(可以理解为调用类下面的函数)
    类名().方法名()
    
    示例代码:
    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()
    

    输出示例:

    <__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__ 方法中定义 增加内存消耗 适用于每个实例独特的数据(如对象的状态)
    可以理解比喻为:
    属性类型 比喻 适用场景
    类属性 狗的的腿和耳朵数量(所有狗狗共享) 所有实例共享的数据,比如常量、默认设置等。
    实例属性 每个狗狗的名字、年龄(所有狗狗独立) 每个实例需要独立数据和状态的场景,比如个性化的对象数据。

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

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

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

    作者:程序小武

    物联沃分享整理
    物联沃-IOTWORD物联网 » Python面向对象编程:创建类与__init__实例化详解

    发表回复