简易理解(快速理解)
- 类对象:定义的类就是类对象
- 实例对象:类对象实例化后就是实例对象
- 类属性:定义在 init 外部的变量
- 实例属性:定义在__init__内部的带有self.的变量
- 类方法:定义在类对象中 且 被@classmethod 装饰的方法就是类方法
- 实例方法:定义在类对象中,且 未被@classmethod 装饰的方法就是实例方法
较深理解
在Python中,类(class)是一种用于创建对象的蓝图或模板。对象(object)是根据类创建的具体实例。类可以包含类属性、实例属性、类方法和实例方法,这些用于定义类的特征和行为。
- 类对象(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
类的类对象。这个标识符可以用来引用该类,调用类方法,或创建该类的实例对象。
- 实例对象(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
。您可以使用这个标识符来引用和操作这个特定的对象。
-
类属性(Class Attribute):类属性是附加到类上的属性,通常对于所有该类的实例都是相同的。它们在类的所有实例之间共享。例如,上面的
make
是一个类属性,所有Car类的实例都共享相同的make
属性。 -
实例属性(Instance Attribute):实例属性是属于实例的属性,每个实例可以具有不同的值。它们在每个实例之间是独立的。例如,如果您为Car类的两个不同实例设置颜色属性,它们可以有不同的颜色值。
car_instance1.color = "Blue" # 实例属性
car_instance2.color = "Red" # 实例属性
- 类方法(Class Method):类方法是绑定到类而不是实例的方法。它们可以访问和修改类属性,但通常不能访问实例属性。类方法使用
@classmethod
装饰器定义,通常接受类作为第一个参数(通常命名为cls
)。例如:
class Car:
make = "Toyota"
@classmethod
def get_make(cls):
return cls.make
# 使用类方法
make = Car.get_make() # 返回"Toyota"
- 实例方法(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__属性,该属性指向类对象,因此能够通过实例对象调用类属性和类方法。