Python的类对象、实例对象、类属性、实例属性、类方法、实例方法

简易理解(快速理解)

  • 类对象:定义的类就是类对象
  • 实例对象:类对象实例化后就是实例对象
  • 类属性:定义在 init 外部的变量
  • 实例属性:定义在__init__内部的带有self.的变量
  • 类方法:定义在类对象中 且 被@classmethod 装饰的方法就是类方法
  • 实例方法:定义在类对象中,且 未被@classmethod 装饰的方法就是实例方法

较深理解

在Python中,类(class)是一种用于创建对象的蓝图或模板。对象(object)是根据类创建的具体实例。类可以包含类属性、实例属性、类方法和实例方法,这些用于定义类的特征和行为。

  1. 类对象(Class Object):类本身也是一个对象,它用于创建类的实例对象。类对象通常用于访问类属性和类方法。例如:
class Car:
    make = "Toyota"  # 类属性

car_class = Car  # car_class是Car类的类对象

我们输出一下car_class结果为
<class '__main__.Car'>

<class '__main__.Car'> 是Python中表示一个类的标识符。我来详细解释这个结果:

  • <class '...' > 表示一个类对象的引用,其中 ... 是类的完整限定名称(包括模块名)。在这里,...__main__.Car 表示。
  • __main__ 是模块名。在Python中,当您直接运行一个脚本时,它将被视为__main__模块,也就是主模块。所以,__main__.Car 意味着 Car 类是在当前执行的脚本(主模块)中定义的。

所以,<class '__main__.Car'> 表示在当前运行的脚本中定义的 Car 类的类对象。这个标识符可以用来引用该类,调用类方法,或创建该类的实例对象。

  1. 实例对象(Instance Object):实例对象是类的具体实例,具有类定义的属性和方法。每个实例都是类的独立对象,可以有自己的属性值。例如:
car_instance = Car()  # car_instance是Car类的一个实例对象

我们输出一下car_instance的结果
<__main__.Car object at 0x00000256C876E640>

<__main__.Car object at 0x00000256C876E640> 是Python中表示一个类的实例对象的标识符。让我为您详细解释这个结果:

  • <__main__.Car object at 0x00000256C876E640> 表示一个 Car 类的实例对象。
  • <__main__.Car> 表示对象所属的类,这里是 Car 类,__main__ 表示这个类是在当前执行的脚本(主模块)中定义的。
  • object at 0x00000256C876E640 提供了对象在内存中的地址,通常以十六进制表示。这个地址是对象在计算机内存中的位置,用来唯一标识对象。

所以,<__main__.Car object at 0x00000256C876E640> 表示在当前执行的脚本中定义的 Car 类的一个实例对象,其内存地址为 0x00000256C876E640。您可以使用这个标识符来引用和操作这个特定的对象。

  1. 类属性(Class Attribute):类属性是附加到类上的属性,通常对于所有该类的实例都是相同的。它们在类的所有实例之间共享。例如,上面的make是一个类属性,所有Car类的实例都共享相同的make属性。

  2. 实例属性(Instance Attribute):实例属性是属于实例的属性,每个实例可以具有不同的值。它们在每个实例之间是独立的。例如,如果您为Car类的两个不同实例设置颜色属性,它们可以有不同的颜色值。

car_instance1.color = "Blue"  # 实例属性
car_instance2.color = "Red"   # 实例属性
  1. 类方法(Class Method):类方法是绑定到类而不是实例的方法。它们可以访问和修改类属性,但通常不能访问实例属性。类方法使用@classmethod装饰器定义,通常接受类作为第一个参数(通常命名为cls)。例如:
class Car:
    make = "Toyota"
    
    @classmethod
    def get_make(cls):
        return cls.make

# 使用类方法
make = Car.get_make()  # 返回"Toyota"
  1. 实例方法(Instance Method):实例方法是绑定到实例的方法,它们可以访问和修改实例属性。实例方法使用类的实例作为第一个参数(通常命名为self)。例如:
class Car:
    def __init__(self, color):
        self.color = color  # 实例属性
        
    def get_color(self):
        return self.color

# 使用实例方法
car_instance = Car("Blue")
color = car_instance.get_color()  # 返回"Blue"

总之,类和实例是面向对象编程的基本概念,类属性和实例属性用于存储数据,类方法和实例方法用于定义类的行为。不同的对象可以有不同的实例属性值,但它们共享相同的类属性和类方法。

全面的举例说明

我们把上述都写在一段代码里进行分析

class Foo:
    # 【类属性】定义在 __init__ 外部的变量
    cls_attr = "我是类属性"

    def __init__(self):
        # 【实例属性】定义在__init__内部的带有self.的变量。没有self.是局部变量
        self.self_attr = "我是实例属性"

    @classmethod
    def cls_func(cls):
        print("我是类方法")
        print("在类方法内部调用类属性", cls.cls_attr)

    def self_func(self):
        print("我是实例方法")
        print("在实例方法内部调用类属性", self.cls_attr)
        print("在实例方法内部调用实例属性", self.self_attr)


if __name__ == '__main__':
    # 类对象:定义的类就是类对象
    print("类对象", Foo)

    # 实例对象:类对象实例化后就是实例对象
    self_obj = Foo()
    print("实例对象", self_obj)
    print("-" * 30)

    # 类属性:定义在 __init__ 外部的变量
    # 类属性可以被类对象调用,也可以被实例对象调用,调用方式是【对象.类属性】调用
    print("类对象调用类属性", Foo.cls_attr)
    print("实例对象调用类属性", self_obj.cls_attr)
    print("-" * 30)

    # 实例属性:定义在__init__内部的带有self.的变量
    # 实例属性只能实例对象调用
    print("实例对象调用实例属性", self_obj.self_attr)
    print("-" * 30)

    # 类方法:定义在类对象中 且 被@classmethod 装饰的方法就是类方法
    # 类方法可以被类对象调用,也可以被实例对象调用,调用方式是【对象.类属性】调用
    print("类对象调用类方法", Foo.cls_func())
    print("实例对象调用类方法", self_obj.cls_func())
    print("-" * 30)

    # 实例方法:定义在类对象中,且 未被@classmethod 装饰的方法就是实例方法
    # 实例方法只能被实例对象调用
    print("实例对象调用类方法", self_obj.self_func())

内存分配

当执行python脚本时,Python解析到类对象时,会给类对象在内存中分配一块区域,在这处内存中存储类对象的所有属性和方法。

当创建实例时,每创建一个实例就会将实例属性和方法全部复制一份,并存储到一块新的内存区域。

类属性和类方法不会被复制,但是我们可以通过实例对象调用它们,这是因为每个创建的实例对象都会添加__class__属性,该属性指向类对象,因此能够通过实例对象调用类属性和类方法。

在这里插入图片描述

  • 3
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值