python深入讲解魔术方法

目录
  • 一、python内置的基本魔术方法
  • 二、python中容器类型的的魔术方法
  • 三、python中算数运算符的魔术方法

什么是魔术方法(魔法方法/特殊方法)

  • 魔术方法都不需要手动去调用
  • 是在特定的情况下触发的
  • 魔术方法都是在python事先定义好的,在定义方法的时候,不要使用魔术方法的命名规范
  • 魔术方法是双划线开头,双划线结尾的

一、python内置的基本魔术方法

init方法

init 是类在实例化时的方法

# 例如
class Mytest():
    def __init__(self):
        print("----这是魔术方法__init__")

Mytest()

call方法

__call__方法的作用 :实现对象可调用

1.没有实现 __call__方法时,对象是不可以被调用的

# 类
class Demo:
    pass
# 判断对象是否可被调用,有个函数可以使用——callable
print(callable(Demo))   ======》 返回True,可被调用
# demo类创建出来的对象是否可被调用,是不能的被调用的
obj = Demo()
obj()

执行结果:提示:‘Demo’ object is not callable ----- 没有__call__方法

2.如果要类创建对象出来的对象可别调用,就要用到__call__方法

class Demo:
    def __call__(self, *args,**kwds):
        print("这是__call__方法执行了")
print(callable(Demo))
# demo类创建出来的对象是否可被调用(不能被调用)
obj = Demo()

obj()          # 等同于:obj.__call__() 方法
obj()
obj()

new 方法

__new__方法的作用 : 是创建对象的方法

__init__方法的作用 : 是用来初始化对象的方法

类的对象要能被调用:

首要new方法创建对象,然后通过init方法初始化

什么时候会需要用到New方法:

干预类实例化对象的过程

注意点:

  • 一般情况不要重写new方法,除非有特定的需求需要使用new方法来实现
  • 定义了new方法之后,需要调用父类的new来创建对象 并返回
class MyTest(object):
    # 初始化对象
    def __init__(self):
        print('-------init------方法')
	# 创建对象
    def __new__(cls, *args, **kwargs):
        print('------new方法-------')
        obj = super().__new__(cls)        # 调用父类的new来创建对象
        return obj     # 并返回新的对象
obj = MyTest()

bool(self)方法

定义当被 bool() 调用时的行为,应该返回 True 或 False

class Demo:
    def __bool__(self):
        """内置函数bool(),获取对象的布尔值是会执行这个方法"""
        return True
b = Demo()
# 获取对象的布尔值,返回True 或 False
print(bool(b))    =====》 返回 True

str(self)方法

使用print去输出对象时,输出到控制台的内容是由__str__来决定的

class Demo:
    def __str__(self):
        """
        使用print去输出对象时,输出到控制台的内容是由__str__来决定的
        """
      return 'zifuc'
b = Demo()
# str方法
s = str('123')
print(s)    =======》 返回 123

repr(self)方法

这个方法也是控制对象显示的,一般会显示对象的原始信息

class Demo:
    def __repr__(self):
        """
        这个方法也是控制对象显示的,一般会显示对象的原始信息
        """
        return 'repr-number'
b = Demo()
# repr方法
s = repr('123')
print(s)    =======》 返回 '123'

len(self)方法

获取对象的长度

class Demo:
    def __len__(self):
        """
        这个方法是获取对象的长度
        :return:
        """
        return 3
 b = Demo()
# 获取对象的长度
print(len(b))    =====》 返回 3

hash(self)方法

返回对象的hash值

class Demo:
    def __hash__(self):
        """
        这个方法是获取hash值
        :return:
        """
        return 999
b = Demo()
# 获取hash值
print(hash(b))    =====》 返回 999

二、python中容器类型的的魔术方法

setitem(self, key, value)方法

定义设置容器中指定元素的行为,语法:self[key] = value

class Mytest:
    def __setitem__(self, key, value):
        return setattr(self, key, value)
m = Mytest()
print(m.__dict__)     没有数据,为空字典
m.name = 'gddg'     ==== 》 设置name属性,值为gddg
m['age'] = 18      ==== 》 设置age属性,值为18

getitem(self, item)方法

定义获取容器中指定元素的行为,语法: self[key]

class Mytest:
    def __getitem__(self,item):
        return getattr(self,item)
m = Mytest()
print(m['name'])     ==== 》 name属性,值为gddg

delitem(self, item)方法

定义删除容器中指定元素的行为,相当于 del self[key]

class Mytest:
    def __delitem__(self,item):
        delattr(self,item)
m = Mytest()
del m['name']      ==== 》 删除name属性

contains(self, item)方法

定义当使用成员测试运算符(in 或 not in)时的行为, 返回 True 或 False

class MyTest:
    def __contains__(self, item):
        """成员运算符触发的魔术方法"""
        return True
a = MyTest()
b = MyTest()
print(a in b)   =======》 返回 True

迭代协议:__iter__方法

定义当迭代容器中的元素的行为

class IterClass:
    def __iter__(self):
        """
        __iter__方法的返回值必须是一个迭代器
        """
        return iter([11, 22, 33, 44])     ===== 》返回一个迭代器
li = IterClass()
for i in li :
	print(i )
for遍历对象:
    1、执行对象的__iter__方法(返回迭代器)
    2、在循环使用next对迭代器进行迭代

三、python中算数运算符的魔术方法

add(a,b)方法 和 sub(a,b)方法

a = 1
b = 2
print(a + b)    ======》 实际执行的是:a.__add__(a,b)
print(a - b)    ======》 实际执行的是:a.__sub__(a,b)

字符串类型的是否支持加减的操作

a = '123'
b = '12'
print(a + b)    ======》 实际执行的是:a.__add__(a,b)
print(a - b)    ======》 实际执行的是:a.__sub__(a,b)

对字符串对象没有实现__sub__方法,所以不支持对象直接使用 -

自己在重新定义__sub__方法,实现对字符串对象的减法

class MyStr(str):
    def __sub__(self, other):
        return self.replace(other, '')
a = MyStr('1234')
b = MyStr('123')
print(a + b)     ======= 》  返回 1234123
print(a - b)    ======= 》  返回 4

到此这篇关于python深入讲解魔术方法的文章就介绍到这了,更多相关python魔术方法内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Python类型转换的魔术方法详解

    本文讨论python中将某个复杂对象转换为简单对象或数据类型的常用魔术放啊,这些在编程中是十分有用的. 1.__str__方法. 在讲解本方法前我们先打开一个jupyter notebook,随意创建一个类如下,使用str()方法输出该类的实例看看返回了什么: class BarChart(object): def __init__(self, x, y, labels,color): self.x = x self.y = y self.labels = labels self.color =

  • Python魔术方法详解

    介绍 此教程为我的数篇文章中的一个重点.主题是魔术方法. 什么是魔术方法?他们是面向对象的Python的一切.他们是可以给你的类增加"magic"的特殊方法.他们总是被双下划线所包围(e.g. __init__ 或者 __lt__).然而他们的文档却远没有提供应该有的内容.Python中所有的魔术方法均在Python官方文档中有相应描述,但是对于他们的描述比较混乱而且组织比较松散.很难找到有一个例子(也许他们原本打算的很好,在开始语言参考中有描述很详细,然而随之而来的确是枯燥的语法描述

  • Python中的__new__与__init__魔术方法理解笔记

    很喜欢Python这门语言.在看过语法后学习了Django 这个 Web 开发框架.算是对 Python 有些熟悉了.不过对里面很多东西还是不知道,因为用的少.今天学习了两个魔术方法:__new__ 和 __init__. 开攻: 如果对 Python 有所简单了解的话应该知道它包含类这个概念的.语法如下: 复制代码 代码如下: class ClassName:     <statement - 1>:         .         .           .     <state

  • python面向对象基础之常用魔术方法

    一.类和对象 通俗理解:类就是模板,对象就是通过模板创造出来的物体 类(Class)由3个部分构成: 类的名称: 类名 类的属性: 一组数据 类的方法: 允许对进行操作的方法 (行为) 二.魔法方法 在python中,有一些内置好的特定的方法,方法名是"__xxx__",在进行特定的操作时会自动被调用,这些方法称之为魔法方法.下面介绍几种常见的魔法方法. 1.__init__方法 :初始化一个 类 ,在创建实例对象为其 赋值 时使用. 2.__str__方法:在将对象转换成字符串 st

  • python进阶之魔术方法详解

    目录 一.三个内置函数 二.双下划线开头和结尾的方法,叫魔术方法. 总结 一.三个内置函数 1.@classmethod–类名.属性名 2.@staticmethod–类名.属性名 3.@property–设置只读属性,方法变属性,别人不易篡改,调用:类名(). 属性名 二.双下划线开头和结尾的方法,叫魔术方法. 1.一个类对象,在__init__初始化之前,还有__new__方法,这里要重写__new__方法,要调用父类的new方法,且将new方法创建的对象返回,即object. new(cl

  • Python魔术方法专题

    _del_ 类的析构方法,它在对象被回收时执行,主要的作用时用来释放资源(内存 文件 进程等) 因为Python内存回收机制,使得Python的del方法的执行时间是不确定的,因此不推荐在Python中使用析构方法. class Bar(object): def __del__(self): print("被回收了! -") a = Bar() a.__del__() # 主动调用是没用的,因为引用计数不为零,并不会回收资源 gc print("已经删除a了") p

  • python深入讲解魔术方法

    目录 一.python内置的基本魔术方法 二.python中容器类型的的魔术方法 三.python中算数运算符的魔术方法 什么是魔术方法(魔法方法/特殊方法) 魔术方法都不需要手动去调用 是在特定的情况下触发的 魔术方法都是在python事先定义好的,在定义方法的时候,不要使用魔术方法的命名规范 魔术方法是双划线开头,双划线结尾的 一.python内置的基本魔术方法 init方法 init 是类在实例化时的方法 # 例如 class Mytest(): def __init__(self): p

  • PHP魔术方法以及关于独立实例与相连实例的全面讲解

    <?php //魔术方法 //当包含多个类 //1.自动装载类的魔术方法__autoload() function __autoload($classname){ if (isset($classname)){ require_once $classname.'.class.php'; } } /* $computer1=new Computer(); $computer1->addList('dalisng',234); echo $computer1; */ //__call()屏蔽调用方

  • python创建堆的方法实例讲解

    1.说明 创建堆有两种基本方法:heappush() 和 heapify(). 当使用heappush()时,当新元素添加时,堆得顺序被保持了. 如果数据已经在内存中,则使用 heapify() 来更有效地重新排列列表中的元素. 2.实例 import heapq from heapq_showtree import show_tree from heapq_heapdata import data heap = [] print('random :', data) print() for n

  • Python定制类你不知道的魔术方法

    目录 Python中的魔法方法 1.__str__ 2.__iter__ 3.__getitem__ 4.__getattr__ 5.__call__ Python中的魔法方法 方法名 说明 __str__ 用于返回对象的描述 __iter__ 使类可以迭代 __getitem__ 按照下标获取类元素,例如list __getattr__ 调用类不存在的属性 __call__ 类实例化默认调用方法 看到类似 __slots__这种形如__xxx__的变量或者函数名就要注意,这些在Python中是

随机推荐