Python类对象核心机制:属性、方法与继承详解
本文深入解析Python中类对象的核心特性。详细阐述类属性与实例属性的优先级关系,区分实例方法、类方法与静态方法的参数要求及调用方式。通过Toy与Cat类示例,展示装饰器@classmethod与@staticmethod的实际应用,并列出object祖先对象包含的基本方法,帮助开发者灵活运用类机制。
抽象特点
在Python中,万物皆对象。基于这一核心概念,类(class)具备以下显著特征:
类与实例的属性
在创建类对象时,可以选择定义类属性。当创建实例对象时,实例属性会通过自动执行类的__init__方法进行初始化。
实例对象会自动继承相应的类属性(如果存在),但在访问属性时,实例属性的优先级高于类属性。
实例方法、类方法与静态方法的参数差异
实例方法本质上是普通函数,但其独特之处在于必须传入self参数,这是它与普通函数的主要区别。
类方法和静态方法是通过装饰器实现的函数。其中,类方法需要传入cls参数,而静态方法既不需要self也不需要cls参数(尽管技术上允许传入其他参数)。
其中,self参数必须指向具体的实例对象,cls参数指向被定义的类对象(注:self与cls仅为约定俗成的命名,原则上可以使用其他名称)。
方法与函数的区别
方法是在对象语境下的函数。当实例调用实例方法时,即视为调用方法;而当类直接调用实例方法时,则等同于调用函数。
具体细节
类举例
class Toy(object): # 此处此类可理解为设计一个Toy的蓝图
# 赋值定义类属性,记录所有玩具数量
count = 0
def __init__(self, name): # 用于实例初始化
self.name = name
# 类属性 +1
Toy.count += 1
@classmethod # 此装饰器表示是类方法,类方法无需创建实例对象即可调用,最为灵活
def show_toy_count(cls):
print('玩具对象的数量 %d' % cls.count, cls)
@staticmethod # 此装饰器表示是静态方法,静态方法本质上是封装在类对象内的的函数,常用于测试
def hi():
print('Hello!')
# 实例方法
def beybey(self):
print('Sad!', self)
# 创建实例对象
toy1 = Toy('乐高')
toy1.hand = 2
toy2 = Toy('泰迪熊')
toy3 = Toy('哥斯拉')
print(toy1.name, toy2.name, toy3.name)
# 点语法调用类方法与静态方法,如:类名.方法
Toy.show_toy_count()
Toy.hi()
# 实例对象调用类方法时,与类对象调用类方法无异,但实际上调用仍通过实例对象继承的类对象
toy1.show_toy_count()
print(toy1.hand)
# 实例对象调用静态方法时,与类对象调用静态方法无异,但实际上调用仍通过实例对象继承的类对象
toy2.hi()
# 实例对象调用实例方法,Python的解释器内部,当我们调用toy3.beybey()时,实际上Python解释成Toy.beybey(toy3)
toy3.beybey()
# Toy.beybey() # 错误语法,self必须指向实例对象,此处实例方法指向类对象而不是实例对象
Toy.beybey(toy3)
# 类与其实例的类型和内存地址
print(type(Toy), id(Toy), type(toy3), id(toy3))
输出结果
乐高 泰迪熊 哥斯拉 玩具对象的数量 3 <class '__main__.Toy'> Hello! 玩具对象的数量 3 <class '__main__.Toy'> 2 Hello! Sad! <__main__.Toy object at 0x000001FD9F794D60> Sad! <__main__.Toy object at 0x000001FD9F794D60> <class 'type'> 2188806599664 <class '__main__.Toy'> 2188813880672
类方法与静态方法举例
class Cat: # 或者class Cat()不写父对象形式定义类对象,会默认继承祖先object对象
name = '小敏'
@classmethod
def www(cls):
print('%s 干嘛!' % cls.name)
# cls.call() # 类方法可以调用静态方法
@staticmethod
def call():
print('喵喵~')
Cat.name = '小敏臭弟弟'
print(Cat.name)
# Cat.www() # 静态方法可以调用类方法
Cat.www()
Cat.call()
# 没有定义实例方法可以创建实例对象继承并使用其中方法
cat1 = Cat()
cat1.www()
cat1.call()
输出结果
小敏 干嘛! 喵喵~ 小敏臭弟弟 小敏臭弟弟 干嘛! 喵喵~ 小敏臭弟弟
祖先对象中包含的基本方法
print(dir(object))
['__class__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__']
总结
类(class)是Python中最核心的对象。定义类时,通常需要完善类属性、实例方法、类方法和静态方法等部分。若将类和继承的类的实例比作函数中的主函数和子函数,那么类属性可视为全局变量,实例属性可视为局部变量;将类比作葫芦,实例方法则是方便我们照画瓢的同时,提供因地制宜的可能;类方法能够使我们更高效地使用类的功能,而静态方法往往能帮助我们了解类的功能。
类的各方法间并非彼此毫不相干,而是有着很强的共性。具体使用时应灵活运用,不应局限在抽象的定义之中。
到此这篇关于Python中类对象的文章就介绍到这了,更多相关Python类对象内容请搜索本站以前的文章或继续浏览下面的相关文章,希望大家以后多多支持本站!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













