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
相关推荐
ESDWAN3 小时前
跨境网络延迟、抖动和丢包有什么区别?如何判断业务影响
开发语言·网络·计算机网络·php
Code_Solitude3 小时前
C语言分支结构练习题(华师版)
c语言·开发语言
青少儿编程课堂3 小时前
蓝桥杯·全国青少年信息素养大赛·电子学会C/C++考级:并查集连通块与朋友圈问题解析
c++·python·算法·bfs·信息学竞赛
外收内放3 小时前
数据分析(数据排序)
python·学习·数据分析
从小白到软工3 小时前
4-1 指针
c语言·开发语言·数据结构·经验分享·ai编程
Pniubi3 小时前
agent处理封号怎么解决误封问题
开发语言·python
.Hypocritical.3 小时前
【Java 进阶】泛型深度解析|泛型类、泛型方法、通配符、类型擦除、PECS 原则
java·开发语言·泛型
VX_bysjlw9853 小时前
基于PHP的论坛系统设计与实现 35136-计算机毕设原创(免费领源码+带部署教程)
开发语言·php·apache·laravel·thinkphp·phpstudy·wampserver
忆~遂愿3 小时前
电影照片散在硬盘里不好找?我用群晖+Plex整理成可远程访问的家庭媒体库
开发语言·php
小羊没烦恼!4 小时前
浅谈SQL Server中的事务日志(二)----事务日志在修改数据时的角色
前端·数据库·后端·python·web安全·oracle