什么叫魔术方法:

在python中定义以双下划线开头,有一些python自定义的函数,并且以双下划线为结尾的函数叫做魔法函数

class Company(object):
def __init__(self, employee_list):
self.employee = employee_list def __getitem__(self, item):
return self.employee[item] def __len__(self):
return len(self.employee) company = Company(["tom", "bob", "jane"]) company1 = company[:2] print(len(company)) for em in company1:
print(em)

当中间定义了__getitem__方法,就将Company变成了一个可迭代对象,调用for循环时,python会一个一个尝试,直到报错。所以打印print(len(company1))不会报错

__subclasshook__:

这个魔术方法有什么用呢?

使用__subclasshook__后只要具体类定义了与抽象类相同的方法就认为是他的子类

import abc

class A(object):
__metaclass__ = abc.ABCMeta @abc.abstractmethod
def say(self):
return 'say yeah' @classmethod
def __subclasshook__(cls, C):
if cls is A:
if any("say" in B.__dict__ for B in C.__mro__):
return True
return NotTmplementd class B(object):
def say(self):
return 'hello' print issubclass(B, A) # True
print isinstance(B(), A) # True
print B.__dict__ # {'say': <function say at 0x7f...>, ...}
print A.__subclasshook__(B) # True

3,__getattr__ 和__getattribute__区别

# __getattr__, __getattribute__
# __getattr__ 就是在查找不到属性的时候调用
from datetime import date class User:
def __init__(self, info={}):
self.in fo = info def __getattr__(self, item):
return self.info[item] # def __getattribute__(self, item):
# return "bobby" 这个是任何时候都会 进入的,不管是否报错 if __name__ == "__main__":
user = User(info={"company_name": "imooc", "name": "bobby"})
print(user.test)
首先调用__getattribute__。如果类定义了__getattr__方法,
那么在__getattribute__抛出 AttributeError 的时候就会调用到__getattr__,

4,property_test

from datetime import date, datetime

class User:
def __init__(self, name, birthday):
self.name = name
self.birthday = birthday
self._age = 0 # 声明不想被修改的属性 # def get_age(self):
# return datetime.now().year - self.birthday.year @property
def age(self):
return datetime.now().year - self.birthday.year @age.setter
def age(self, value):
self._age = value if __name__ == "__main__":
user = User("bobby", date(year=1987, month=1, day=1))
user.age = 30
print(user._age)
print(user.age)

其实property主要的作用就是将方法的调用伪装为一个属性的查找方式

5,__new__和__init__区别

class User:
def __new__(cls, *args, **kwargs):
print(" in new ")
return super().__new__(cls) def __init__(self, name):
print(" in init")
pass a = int()
# new 是用来控制对象的生成过程, 在对象生成之前
# init是用来完善对象的
# 如果new方法不返回对象, 则不会调用init函数
if __name__ == "__main__":
user = User(name="bobby")

运行结果如下:

 in new
in init

__new__在python3新式类才有的,python2.2之前中是没有的,这个方法允许我们在生成对象之前加逻辑,

所以他传入的参数是cls类。和__init__的根本区别在于,__new__可以自定义类的生成过程的,在__init__之前,不管是传参也好,不传参也好,都需要经过__new__方法

new 是用来控制对象的生成过程, 在对象生成之前

init是用来完善对象的

一般在框架中见得多。(用于元类编程)

python的魔术方法的更多相关文章

  1. python的魔术方法大全

    在Python中,所有以“__”双下划线包起来的方法,都统称为“Magic Method”(魔术方法),例如类的初始化方法 __init__ ,Python中所有的魔术方法均在官方文档中有相应描述,这 ...

  2. python常用魔术方法概览

    构造和初始化 __init__(self, args) 构造函数 __new__(cls) 传入的是类实例 __del__(self) 析构函数,调用 del cls 时会被调用 属性访问控制 __g ...

  3. Python的魔术方法总结

    魔术方法:再不需要程序员定义,本身就存在类中的方法就是魔术方法. 魔术方法通常都长这样:__名字__. 1.__str__和__repr__ 为了方便记忆看如下列子 class Course: def ...

  4. Python的魔术方法详解

    构造和初始化 __init__我们很熟悉了,它在对象初始化的时候调用,我们一般将它理解为"构造函数". 实际上, 当我们调用x = SomeClass()的时候调用,__init_ ...

  5. python面向对象魔术方法补充

    一.描述符 在 面向对象 编程中 定义一个(没有定义方法)类:class person , 在这个类里面,有name,age, heigth, weight,等等属性, 这个类就可以看作一个对 per ...

  6. Python魔术方法-Magic Method

    介绍 在Python中,所有以"__"双下划线包起来的方法,都统称为"Magic Method",例如类的初始化方法 __init__ ,Python中所有的魔 ...

  7. Python 魔术方法指南

    入门 构造和初始化 构造定制类 用于比较的魔术方法 用于数值处理的魔术方法 表现你的类 控制属性访问 创建定制序列 反射 可以调用的对象 会话管理器 创建描述器对象 持久化对象 总结 附录 介绍 此教 ...

  8. Python 类的魔术方法

    Python中类的魔术方法 在Python中以两个下划线开头的方法,__init__.__str__.__doc__.__new__等,被称为"魔术方法"(Magic method ...

  9. Python中的魔术方法详解

    介绍 在Python中,所有以“__”双下划线包起来的方法,都统称为“Magic Method”,中文称『魔术方法』,例如类的初始化方法 __init__ ,Python中所有的魔术方法均在官方文档中 ...

随机推荐

  1. Redis缓存系统(一)Java-Jedis操作Redis,基本操作以及 实现对象保存

    版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/jiangtao_st/article/details/37699473 源码下载: http://d ...

  2. 第一个Python小项目:图片转换成字符图片

    实现的效果:                                                                                               ...

  3. LOJ 2546 「JSOI2018」潜入行动——树形DP

    题目:https://loj.ac/problem/2546 dp[ i ][ j ][ 0/1 ][ 0/1 ] 表示 i 子树,用 j 个点,是否用 i , i 是否被覆盖. 注意 s1<= ...

  4. c#中枚举类型 显示中文

    public enum AuditEnum { [Description("未送审")] Holding=0, [Description("审核中")] Aud ...

  5. 如何在idea中引入一个新maven项目

    如何在idea中引入一个新的maven项目,请参见如下操作:      

  6. DNS主从配置详解

    实验环境 主服务器:192.168.138.200 从服务器:192.168.138.201 bind安装 安装很简单,执行以下命令即可: yum install -y bind 先看一下bind的版 ...

  7. 基于MATLAB System Generator 搭建Display Enhancement模型

    基于MATLAB System Generator 搭建Display Enhancement模型

  8. 解决ubuntu16.04桌面左侧栏和顶部栏消失的问题

    重要事情说三遍! 不要轻易重装系统! 不要轻易重装系统! 不要轻易重装系统! 问题所在:误删了unity桌面. 解决方法: $sudo apt-get install unity

  9. android升级gradle到3.4.1

    这两天把gradle升级到了gradle-3.4.1 com.android.tools.build:gradle升级到了com.android.tools.build:gradle:2.3.0 结果 ...

  10. 在他机上还原DB2的备份

    在服务器获取得到db2的备份文件,拷贝到d盘db2_backup目录下面 在windows下的时间戳标记为时间目录名+文件名.001前面的 "2014022\0001006.001" ...