首页 > 编程语言 >Python常用魔法方法

Python常用魔法方法

时间:2023-04-27 09:24:44浏览次数:38  
标签:__ 常用 obj name Python self 魔法 print age

Python常用魔法方法

1 、__new__()

__new__是在实例创建之前被调用的,用于创建实例,然后返回该实例对象

2、__init__()

__init__是当实例对象创建完成后被调用的,用于初始化一个类实例

class MyClass(object):
    def __init__(self, name, age):
        print('__init__ called')
        self.name = name
        self.age = age

    def __new__(cls, *args, **kwargs):
        print('__new__ called')
        return super(MyClass, cls).__new__(cls)
# 执行
obj = MyClass('cc', 24)
print(obj.name)
print(obj.age)

# 输出
__new__ called
__init__ called
cc
24

3 、__str__()

对象被执行打印操作的时候自动触发, 该方法必须返回字符串类型的数据,很多时候用来更加精准的描述对象

class Myclass(object):
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def __str__(self):
        return '打印的变成我了'
# 执行
obj = Myclass('cc', 24)
print(obj)

# 输出
打印的变成我了

4、__call__()

对象被加括号调用的时候自动触发

class Myclass(object):
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def __call__(self, *args, **kwargs):        
        print('__call__ called', args, kwargs)
        return '嘿嘿嘿'
# 执行
obj = Myclass('cc', 24)
obj(1, 2, 3, sex='male')
print(obj(1, 2))

# 输出
__call__ called (1, 2, 3) {'sex': 'male'}
__call__ called (1, 2) {}
嘿嘿嘿

5、__del__()

对象被执行(被动、主动)删除操作之后自动执行

class Myclass(object):
    def __init__(self, name, age):
        self.name = name
        self.age = age
       
    def __del__(self):
        print('__del__ called')
# 主动删除:使用del关键字主动删除
obj = Myclass('cc', 24)
del obj  # 主动删除对象
print(obj.name)

# 输出
NameError: name 'obj' is not defined
__del__ called

------------------------------------

# 被动删除:即对象调用完后自动删除
obj = Myclass('cc', 24)
print(obj.name)
print(obj.age)

# 输出
cc
24
__del__ called

6、__getattr__()

对象查找不存在名字的时候自动触发

class MyClass(object):
    def __init__(self, name, age):
        print('__init__ called')
        self.name = name
        self.age = age
        
    def __getattr__(self, item):
        print('__getattr__ called')
        return '找不到'
# 执行
obj = MyClass('cc', 24)
print(obj.name)
print(obj.age)
print(obj.sex)

# 输出
__init__ called
cc
24
__getattr__ called
找不到

7、__setattr__()
对象在执行添加属性操作的时候自动触发>>>obj.变量名=变量值

class Myclass(object):
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def __setattr__(self, key, value):
        print('__setattr__ called')
        print(key, value)
# 执行
obj = Myclass('cc', 24)
obj.sex = 'male'

# 输出
__setattr__ called
name cc
__setattr__ called
age 24
__setattr__ called
sex male

8、__getattribute__()
对象查找名字无论名字是否存在都会执行该方法
如果类中有'__getattribute__'方法 那么就'不会'去执行'__getattr__'方法

class Myclass(object):
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def __getattribute__(self, item):
        print('__getattribute__ called', item)

    def __getattr__(self, item):
        print('__getattr__ called', item)
        return '找不到'
# 执行
obj = Myclass('cc', 24)
print(obj.name)
print(obj.sex)

# 输出
__getattribute__ called name
None
__getattribute__ called sex
None

9、__enter__() 与 __exit__()

__enter__: 对象被执行with上下文管理语法自动触发

__exit__: 对象被执行with上下文管理语法结束之后自动触发

class Myclass(object):
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def __enter__(self):
        print('__enter__ called')

    def __exit__(self, exc_type, exc_val, exc_tb):
        print('__exit__ called')
# 执行
obj = Myclass('cc', 24)
with obj as f:
    print('执行中...')
print(123)

# 输出
__enter__ called
执行中...
__exit__ called
123

作者:陈超

标签:__,常用,obj,name,Python,self,魔法,print,age
From: https://www.cnblogs.com/DTCLOUD/p/17357987.html

相关文章

  • 递归比较两个字典差异-python dict different
    deffindDiff(d1,d2,path=""):forkind1:if(knotind2):print(path,":")print(k+"askeynotind2","\n")else:iftype(d1[k])isdict:......
  • python数据可视化神库:Matplotlib快速入门
    Matplotlib易于使用,是Python中了不起的可视化库。它建立在NumPy数组的基础上,旨在与更广泛的SciPy堆栈一起工作,并由几个图组成:线图、条形图、散点图、直方图等。快速入门importmatplotlib.pyplotasplt#initializingthedatax=[10,20,30,40]y=[20,30,40,50]......
  • Docker CLI docker compose logs常用命令
    Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的Linux或Windows操作系统的机器上,也可以实现虚拟化。Docker是内核虚拟化,不使用Hypervisor是不完全虚拟化,依赖内核的特性实现资源隔离。本文主要介绍DockerCLI中d......
  • 合并两个有序链表--Python实现
    将两个升序链表合并为一个新的升序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。#Definitionforsingly-linkedlist.#classListNode:#def__init__(self,x):#self.val=x#self.next=NoneclassSolution:defmergeT......
  • macos Python.运行时,遇到这个问题:ImportError: ('Unable to load OpenGL library', "
    问题安装https://gitee.com/mirrors/animated-drawings这个部署时,安装环境出现如下问题:pycharm下打开这个文件:python3.9/site-packages/OpenGL/platform/ctypesloader.py在79行下修改如下:......
  • python+playwright 学习-57 svg 元素拖拽
    前言SVG英文全称为ScalablevectorGraphics,意思为可缩放的矢量图,这种元素比较特殊,需要通过​name​()函数来进行定位。本篇讲下关于svg元素的拖拽相关操作。拖拽svg元素如图所示,svg下的circle元素是可以拖动的比如往右拖动100个像素,那么cx的值由原来的cx="100"变成......
  • python的文件路径操作(转)
    1.1绝对路径不同操作系统下绝对路径的表现形式是不一样的,以Windows系统为例,一个文件的路径可能是这样的:D:\files\data\ndvi.tif其中:D:\:表示根文件夹,是文件所在的盘符,即D盘。D:\files\data:表示文件所在的文件夹的路径,即D盘的files文件夹的子文件夹data。ndvi.tif:表示文件名......
  • python打包工具-Nuitka
    nuitka将python源码转成C++(这里得到的是二进制的pyd文件,防止了反编译),然后再编译成可执行文件。提高安全性和运行速度。github:https://github.com/2267770481/cython_test安装pipinstallnuitkapipinstallordered-set#加速编译pipinstallzstandard#onefile时压缩文件......
  • windows下mysql5.7安装,及python操作mysql
    windows下mysql5.7安装mysql5.7官方下载:https://www.mysql.com/可参考教程:https://blog.csdn.net/qq_39715000/article/details/123534326?注意:一:my.ini配置文件:如果保存目录以t开头,默认会将t转义为空格(解决方法加这个\\):[mysqld]#端口号port=3306#mysql-5.7.27-winx6......
  • 树莓派4B-Python-控制超声波模块
    树莓派4B-Python-控制超声波模块超声波模块:超声波模块为常用的HC-SR04型号,有四个引脚,分别为Vcc、Trig(控制端)、Echo(接收端)、GND,使用起来也比较简单。在树莓派最新官方系统Raspbian中都安装有一个比较好使用的GPIO库,名为“gpiozero”,它包含了许多模块的使用函数,直接调用就好。参......