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
相关推荐
yuhaiqun19892 小时前
Typora 技能进阶:从会写 Markdown 到玩转配置 + 插件高效学习笔记
经验分享·笔记·python·学习·学习方法·ai编程·markdown
眠りたいです2 小时前
现代C++:C++11并发支持库
开发语言·c++·多线程·c++11·c++并发支持库
小灰灰搞电子3 小时前
Rust可以取代C++么?
开发语言·c++·rust
我送炭你添花3 小时前
Pelco KBD300A 模拟器:06+2.Pelco KBD300A 模拟器项目重构指南
python·重构·自动化·运维开发
Swizard3 小时前
别再只会算直线距离了!用“马氏距离”揪出那个伪装的数据“卧底”
python·算法·ai
cat三三3 小时前
java之异常
java·开发语言
站大爷IP3 小时前
Python函数与模块化编程:局部变量与全局变量的深度解析
python
奇树谦3 小时前
【Qt实战】实现图片缩放、平移与像素级查看功能
开发语言·qt
我命由我123453 小时前
Python Flask 开发问题:ImportError: cannot import name ‘Markup‘ from ‘flask‘
开发语言·后端·python·学习·flask·学习方法·python3.11