Python类属性与魔术方法全解析

Python学习笔记-Day8

类属性方法

类属性就是类的对象属性,也就是类中的变量
类方法就是类里面的函数,而类里的函数就是方法

类的属性

复制代码
#定义一个类,然后名字是ANimal,里面的object可写可不写,因为在python3中,class a():和class(object)完全一样,写object是为了python2/3的兼容性
class Animal(object):  
    owner = 'youzi'  
  
    def __init__(self,name):  
        self.name = name  
  
#没有进行实例化的  
print(Animal.owner)

类的方法

复制代码
#可以让脚本自己在绝对路径下找到python的解释器
#!/usr/bin/env python3  
  
#类的方法  
class Animal(object):
	#定义一个变量  
    owner = '游子'
    #初始化函数  
    def __init__(self,name):
	    #属性name  
        self.name = name  
	#可以让我们直接通过类调用,不需要实例,下面会再解释一下的
    @classmethod  #装饰器  
    #定义一个函数,也称为方法
    #cls 代表类本身(Animal),这个时候我们如果想使用owner,就要cls.owner调用,在类中类变量和属性的调用方法都是一样的
    def get_owner(cls):
	    #这边就返回  
        return cls.owner  
  
    @classmethod  
    def set_owner(cls,name):  
        cls.owner = name  
  
#不用实例化,直接调用
print(Animal.owner)
#修改name的值  
Animal.set_owner('youzi')  
#打印owner的值
print(Animal.owner)

静态方法与魔法方法

复制代码
@staticmethod 静态方法
@classmethod 类方法

#!/usr/bin/env python3  
  
# 类的方法  
class Animal:  
    owner = '游子'  
  
    def __init__(self, name):  
        self.name = name  
  
    # 静态方法:  
    # 既不需要实例self,也不需要类  
    @staticmethod  
    def order_animal_found():  
        print('<UNK>')  
        print('<UNK>')  
        print('<UNK>')  
        print('<UNK>')  
  
#不用实例化,直接调用  
Animal.order_animal_found()  
  
#没有使用@staticmethod  
a = Animal('youzi')  
a.order_animal_found()

魔术方法

复制代码
#从time导入sleep函数
from time import sleep  
  
#定义了一个Animal类
class Animal(object):
#创建实例,并添加两个cls和name参数  
    def __new__(cls,name):  
        print("__new__")  
        #对Animal类中的cls进行实例化
        return super(Animal,cls).__new__(cls)
    #初始化类  
    def __init__(self,name):  
        print("__init__")  
        self.name = name
    #定义了一个方法,是删除类的  
    def __del__(self):  
        print("__del__")  
  
cat = Animal('tom')  
#这个代码的作用是,可以观察到对象从创建到销毁的完整过程  
#防止程序结束太快,对象被立即回收看不到__del__  
#当我们让程序睡眠5秒时,程序还是在执行的
sleep(10)

类的魔术方法解释

init方法:

  1. 在创建对象时自己调用
  2. 用于初始化对象的属性
  3. 第一个参数必须是self(指向对象本身)

new方法 : 真正创建对象的方法

  1. 在init之前调用
  2. 负责分配内存并返回对象
  3. 可以控制对象的创建过程

更多的魔术方法

类别 方法 描述 触发方式
构造/析构 __new__ 创建对象 obj = Class()
__init__ 初始化对象 obj = Class()
__del__ 销毁对象 del obj 或垃圾回收
字符串表示 __str__ 用户友好字符串 str(obj), print(obj)
__repr__ 官方字符串 repr(obj), 交互式环境
__format__ 格式化输出 format(obj, spec)
属性访问 __getattr__ 访问不存在属性 obj.undefined
__getattribute__ 访问任何属性 obj.any_attribute
__setattr__ 设置属性 obj.attr = value
__delattr__ 删除属性 del obj.attr
__dir__ 列出属性 dir(obj)
容器操作 __len__ 获取长度 len(obj)
__getitem__ 索引访问 obj[key]
__setitem__ 设置值 obj[key] = value
__delitem__ 删除项 del obj[key]
__contains__ 成员测试 item in obj
__iter__ 迭代 for x in obj
__reversed__ 反向迭代 reversed(obj)
数值运算 __add__ 加法 obj + other
__sub__ 减法 obj - other
__mul__ 乘法 obj * other
__truediv__ 除法 obj / other
__eq__ 等于 obj == other
__lt__ 小于 obj < other
__gt__ 大于 obj > other
上下文管理 __enter__ 进入上下文 with obj:
__exit__ 退出上下文 with obj: 结束
调用操作 __call__ 使对象可调用 obj()
描述符 __get__ 描述符获取 作为属性访问时
__set__ 描述符设置 属性赋值时
__delete__ 描述符删除 del obj.attr
相关推荐
阿尔的代码屋5 小时前
[大模型实战 07] 基于 LlamaIndex ReAct 框架手搓全自动博客监控 Agent
人工智能·python
AI探索者1 天前
LangGraph StateGraph 实战:状态机聊天机器人构建指南
python
AI探索者1 天前
LangGraph 入门:构建带记忆功能的天气查询 Agent
python
FishCoderh1 天前
Python自动化办公实战:批量重命名文件,告别手动操作
python
躺平大鹅1 天前
Python函数入门详解(定义+调用+参数)
python
曲幽1 天前
我用FastAPI接ollama大模型,差点被asyncio整崩溃(附对话窗口实战)
python·fastapi·web·async·httpx·asyncio·ollama
两万五千个小时1 天前
落地实现 Anthropic Multi-Agent Research System
人工智能·python·架构
哈里谢顿1 天前
Python 高并发服务限流终极方案:从原理到生产落地(2026 实战指南)
python
用户8356290780512 天前
无需 Office:Python 批量转换 PPT 为图片
后端·python
markfeng82 天前
Python+Django+H5+MySQL项目搭建
python·django