面向对象进阶
一、静态方法:
特征:静态方法只是名义上归类管理,实际和类没任何关联,访问不了类的任何属性
使用方法:@staticmethod
def method()
二、类方法 @classmethod
特征:只能访问类变量,不能访问实例变量
三、属性方法 @property
把一个类方法变成属性。例子如下:
class People(object): def __init__(self, name): self.name = name @property # 变成属性方法,但不能赋值 def eat(self): print('{}正在吃!'.format(self.name)) @eat.setter # 也是一个属性,同时使用赋值语句则调用此方法,必须在@property下 def eat(self, food): print('{}正在吃{}!'.format(self.name, food)) @eat.deleter # 也是删除,在del p1.eat中调用,必须在@property下 def eat(self): print('已经删除') p1 = People('LiZuoQi') p1.eat # 调用15行的eat p1.eat = '屎' # 调用19行的eat,并能给参数赋值 del p1.eat # 调用24行的eat
四、类的特殊成员方法
1、__doc__:用于打印类的描述信息,一个隐藏属性,例子如下:
class Dog(object): """此类用于描述狗""" def __init__(self, name): self.name = name print(Dog.__doc__)
2、__module__:属性,模块名
__class__:属性,类名
例子:
from lib.aa import C obj = C('LiZuoQi') print(obj.__module__) # 输出模块名 print(obj.__class__) # 输出类名
class C(object): def __init__(self, name): self.name = name
3、__call__方法:类中特殊的方法。
调用方法:obj(<参数>),例子如下:
class Dog: def __init__(self,name): self.name = name def bulk(self): print('%s:wang wang wang' % self.name) def __call__(self, *args, **kwargs): print('running call') d1 = Dog('LiZuoQi') d1() # 此处运行结果会显示running call
4、__dict__:属性,
class.__dict__:打印类中的所有属性,但不包括实例属性
obj.__dict__:打印实例中的属性,但不包括类属性
class Dog: def __init__(self,name): self.name = name def bulk(self): print('%s:wang wang wang' % self.name) def __call__(self, *args, **kwargs): print('running call') print(Dog.__dict__) d1 = Dog('LiZuoQi') print(d1.__dict__)
5、__str__:方法
外部调用方法:print(obj_name)即触发执行,默认打印对象的内存地址,可重写,例子:
class Dog: def __init__(self,name): self.name = name def bulk(self): print('%s:wang wang wang' % self.name) def __call__(self, *args, **kwargs): print('running call') def __str__(self): return 'Obj:{}'.format(self.name) d1 = Dog('LiZuoQi') print(d1)
6、__setitem__:方法,在实例中用字典的方式赋值时触发obj[key]=val
__getitem__:在实例中用字典的方式获取键对应的值时触发obj[key]
__delitem__:del obj[key]时触发
class Dog: def __init__(self,name): self.name = name def bulk(self): print('%s:wang wang wang' % self.name) def __setitem__(self, key, value): print('in the setitem') def __getitem__(self, item): print('in the getitem') def __delitem__(self, key): print('in the delitem') d1 = Dog('LiZuoQi') d1['name'] = 'alex' d1['name'] del d1['name']
7、
(1)、所有类的起源均是type
声明类可使用一个特殊的方法,例子,如下:
def __init__(self, name ,age): self.name = name self.age = age def talk(self): print('%s is talking'% self.name) FOO = type('FOO', (object,), {'__init__':__init__, # 此处利用type定义了一个类 'talk': talk}) f = FOO('LiZuoQi', 13) f.talk()
(2)、__new__方法:用于创建实例,调用__init__函数
__metaclass__:类中有一个属性 __metaclass__,其用来表示该类由 谁 、以什么形式来实例化创建,所以,我们可以为 __metaclass__ 设置一个type类的派生类,从而查看 类 创建的过程。
(3)、__call__:方法,调用方法class_name()(),例子如下:

def main(): class Dog(object): def __init__(self): self.name = 'Alex' def __call__(self, *args, **kwargs): print('in the call') Dog()() if __name__ == '__main__': main()
8、反射:把字符串转换成属性或方法
(1)hasattr(obj,name_str):判断obj是否有name_str方法或属性
(2)、getattr(obj,name_str):返回obj中name_str方法的内存地址或name_str属性的值
(3)、setattr(obj,name_str,fun):添加obj中的name_str方法为fun,或name_str属性为fun。
(4)、delattr(obj,name_str):删除obj中的name_str属性或方法
使用例子:
def bulk(self):
print('%s is yelling' % self.name)
class Dog(object):
def __init__(self, name):
self.name = name
def eat(self, food):
print('%s is eating...%s' % (self.name, food))
d1 = Dog('LiZuoQi')
com_str = input(':>>')
# if hasattr(d1, com_str): # 判断d1中是否有com_str属性
# fun = getattr(d1, com_str) # 调用com_str属性
# fun('shit')
# else:
# # setattr(d1, com_str, bulk) # 设置d1中的com_str方法为bulk(已定义)
# # d1.talk(d1) # 调用上面设置好的方法
# setattr(d1, com_str, 30) # 设置d1中的com_str属性为30
# print(getattr(d1, com_str)) # 获取d1中的com_str属性
delattr(d1, com_str) # 删除d1中的com_str属性
判断当前模块是否有某函数:

import sys def hello(name): print('Hello,', name) mod = sys.modules[__name__] if hasattr(mod, 'hello'): print('有此函数')
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 上周热点回顾(3.3-3.9)
· AI 智能体引爆开源社区「GitHub 热点速览」