"""
py魔法方法.py
(__new__/metaclass元类、__init__、__getattr__、__callable__等)使用:1、#使用__new__() 来定义创建对象的方式。
2、#使用__init__() 来初始化创建的实例对象。
3、#使用:__str__()魔法方法来定义print输出
4、#使用:__repr__()魔法方法来定义调试输出,即非print输出
5、#使用:__iter__及__next__魔法方法来定义 对象的迭代循环。
6、#使用:__getitem__来定义迭代对象的指定索引,即列表的索引
#注意:__getitem__通过实例对象的输入参数类型是否slice,来实现切片操作。7、#使用:__getattr__魔法方法 动态返回一个属性
#注意:__getattr__只有在没找到属性的情况下才调用,已有的属性不会在__getattr__中查找。8、#使用:__call__魔法方法 来使 类的实例对象可以直接实例对象()调用。即:实例对象() 的格式进行输出
#对实例对象进行直接调用就好比对一个函数进行调用一样,可以定义参数等。
#注意:实例对象调用 和 函数调用的概念区别,实质一样。#使用:callable()函数来判断一个对象是否是 可调用对象,即:是否能被调用()。"""#################### 定制类:魔法方法/特殊属性方法
#使用:特殊属性和特殊方法(__xxx__格式的属性方法)可以在类定义中进行定制类操作。
#定制类官方参考网址:https://docs.python.org/zh-cn/3/reference/datamodel.html#special-method-names#__new__、__init__(创建对象、初始化对象)
#构造方法包括创建对象和初始化对象,在python当中,分为两步执行:先执行__new__方法,然后执行__init__方法;##########
#使用__new__() 来定义创建对象的方式。
#__new__  在实例创建之前被调用的,因为它的任务就是创建实例然后返回该实例,是个静态方法。#使用:metaclass控制类的创建行为,根据metaclass创建出类,即:先定义metaclass,就可以创建类,最后创建实例。
#metaclass允许创建类或者修改类,也可以把类看成是metaclass创建出来的“实例”。
#注意:默认metaclass的类名总是以Metaclass结尾,以便清楚地表示这是一个metaclass
#注意:metaclass是类的模板,所以必须从`type`类型派生:
class ListMetaclass(type):"""定义一个类,用来作为后期创建类的元类。"""def __new__(cls, name, bases, attrs):attrs['add'] = lambda self, value: self.append(value)return type.__new__(cls, name, bases, attrs)           #返回type()创建类的__new__方法。
#####
#使用:__new__魔法方法定义类创建过程。
#__new__()方法接收到的参数依次是:
#参数1:当前准备创建的类的对象;
#参数2:类的名字;
#参数3:类继承的父类集合;
#参数4:类的方法集合。##########
#使用__init__() 来初始化创建的实例对象。
#__init__ 当实例对象创建完成后被调用的,然后设置对象属性的一些初始值。#####
#使用:super函数 调用父类方法。
#使用:super(子类名,self).__init__() 来显示调用 父类初始化方法
#注意:Python3可以使用直接使用 super().xxx 代替 super(Class, self).xxx :#子类没有定义自己的初始化函数,父类的初始化函数会被默认调用:
#定义父类:Parent
class Parent(object):def __init__(self, name):self.name = nameprint("create an instance of:", self.__class__.__name__)print("name attribute is:", self.name)
#定义子类Child ,继承父类Parent
class Child(Parent):pass
#子类实例化时,由于子类没有初始化,此时父类的初始化函数就会默认被调用
#且必须传入父类的参数name
c = Child("init Child") #子类定义了自己的初始化函数,而在子类中没有显示调用父类的初始化函数,则父类的属性不会被初始化
class Child(Parent):#子类中没有显示调用父类的初始化函数,相当于重写了初始化方法。def __init__(self):print("call __init__ from Child class")
c = Child("init Child")
print()  #子类定义了自己的初始化函数,显示调用父类,子类和父类的属性都会被初始化
class Child(Parent):def __init__(self):print('Call __init__ from Child class')super(Child,self).__init__('data from Child') #要将子类Child和self传递进去
d=Parent('Tom')
c=Child()
print(c.name)##########
#__str__(定义print输出)、__repr__(定义调试输出)
#使用:__str__()魔法方法来定义print输出
#使用:__repr__()魔法方法来定义调试输出,即非print输出
class Student(object):def __init__(self,name):self.name=namedef __str__(self):""" #使用:__str__()魔法方法来定义print输出"""return 'print输出内容:\nStudent Object (name:{})'.format(self.name)"""将输出设置一致"""
#    __repr__=__str__def __repr__(self):"""#使用:__repr__()魔法方法来定义调试输出,即非print输出"""return '调试输出内容: \nStudent Object  (name:{})'.format(self.name)
print(Student('Michael'))
Student('Michael')##########
#__iter__、__next__(定义循环可迭代对象)
#使用:__iter__及__next__魔法方法来定义 对象的迭代循环。#定义斐波那契数列类
class Fib(object):def __init__(self):self.a, self.b=0,1def __iter__(self):"定义迭代返回值,如果返回None则表示不可迭代"return self        #实例本身就是迭代对象,所有返回自己本身def __next__(self):self.a, self.b=self.b, self.a+self.bif self.a>1000:raise StopIteration()return self.a
Fib()
for f in Fib():print(f)##########
#__getitem__(定义迭代的指定索引)
#使用:__getitem__来定义迭代对象的指定索引,即列表的索引
#注意:__getitem__通过实例对象的输入参数类型是否slice,来实现切片操作。#使用:__getitem__来定义迭代对象的指定索引,即列表的索引
class Fib(object):def __getitem__(self,n):a,b=1,1for x in range(n):a,b=b,a+breturn a
f=Fib()
f[5]     #像list那样按照下标取出元素#注意:__getitem__通过实例对象的输入参数类型是否slice,来实现切片操作。
#定义迭代对象的 切片操作 slice
class Fib(object):def __getitem__(self,n):"""如果输入参数属于 int整数类型,则输出该索引对应的值"""if isinstance(n,int):a,b=1,1for x in range(n):a,b=b,a+breturn a"""通过对 实例对象的参数判断 来实现切片操作;即:如果输入参数属于 slice,则定义并返回新的列表"""if isinstance(n,slice):start=n.startstop=n.stopif start is None:start=0a,b=1,1L=[]for x in range(stop):if x >= start:L.append(a)    #通过不断的添加a来形成返回结果用的L列表,即切片的结果。a,b=b,a+breturn L
f=Fib()
f[1:6]##########
#__getattr__
#使用:__getattr__魔法方法 动态返回一个属性
#注意:__getattr__只有在没找到属性的情况下才调用,已有的属性不会在__getattr__中查找。
class Student(object):def __init__(self):self.name='Michael'"""#使用:__getattr__魔法方法 动态返回一个属性;#注意:__getattr__只有在没找到属性的情况下才调用,已有的属性不会在__getattr__中查找。"""def __getattr__(self,attr):if attr == 'score':return 99
s=Student()
s.name
s.scoreclass Student(object):def __getattr__(self,attr):if attr == 'age':return lambda:25      #返回函数也是完全可以的。只是需要注意调用的时候加上括号()return AttributeError('\'Stuende类对象没有属性{}'.format(attr))
s=Student()
s.age()                           #注意调用的时候加上括号,因为__getattr__里定义返回的是函数。
s.time
"""没有定义__call__魔法方法的类不能直接通过类实例对象名()如函数般来调用"""
#s().time                          #通过重写类的__getattr__ 及 __str__方法实现链式调用Api输出。
class Chain(object):def __init__(self,path=''):self._path=pathdef __getattr__(self,path):return Chain('{}/{}'.format(self._path, path))def __str__(self):return self._path__repr__=__str__
Chain().status
Chain().users.ker945.git##########
#__call__:实例对象()调用
#使用:__call__魔法方法 来使 类的实例对象可以直接实例对象()调用。即:实例对象() 的格式进行输出
#对实例对象进行直接调用就好比对一个函数进行调用一样,可以定义参数等。
#注意:实例对象调用 和 函数调用的概念区别,实质一样。#使用:callable()函数来判断一个对象是否是 可调用对象,即:是否能被调用()。class Student(object):def __init__(self,name):self.name=namedef __call__(self,age=10):print('My name is {},My age is {}'.format(self.name,age))
s=Student('Michael')
"""定义__call__魔法方法的类,可以直接通过类实例对象名()如函数般来调用,否则不能直接类实例对象名()调用"""
s(11)"""如果__call__类对象如函数般调用,则就模糊了对象和函数的界限;则通过callable()函数来判断对象是否可调用"""
callable(Student('xiaowang'))
callable(max)
callable(1)
callable('str')

py魔法方法(__new__/metaclass元类、__init__、__getattr__、__callable__等)相关推荐

  1. python——type()、metaclass元类和精简ORM框架

    1.type()函数 #type()函数既可以返回一个对象的类型,又可以创建出新的类型, # 比如,我们可以通过type()函数创建出Hello类,而无需通过class Hello(object).. ...

  2. instance实例对象、class类对象、meta-class元类对象

    instance实例对象.class类对象.meta-class元类对象 1.instance的isa指向class 1>当调用对象方法时,通过instance的isa找到class,最后找到对 ...

  3. python魔法方法__new__(),__init__()

    Python 2的早期,确实是没有__new__函数的,但那是很多年前的事情了,现在的Python 2和Python 3中,类实例的创建过程均遵循先调用__new__函数构造类实例,然后调用__ini ...

  4. python引用类 魔法方法_Python 学习笔记 -- 类的魔法方法

    常用魔法方法 含义 __new__(cls[,...]) 1.__new__在对象被实例化时调用 2.第一个参数是类本身,其他参数传入__init__中 3.__new__如果没有返回值,则不会调用_ ...

  5. 深刻理解Python中的元类(metaclass)以及元类实现单例模式

    在看一些框架源代码的过程中碰到很多元类的实例,看起来很吃力很晦涩:在看python cookbook中关于元类创建单例模式的那一节有些疑惑.因此花了几天时间研究下元类这个概念.通过学习元类,我对pyt ...

  6. 编写python程序、创建名为class的数据库_Python中的元类(metaclass)以及元类实现单例模式...

    一.理解类也是对象 在理解元类之前,你需要先掌握Python中的类.Python中类的概念借鉴于Smalltalk,这显得有些奇特.在大多数编程语言中,类就是一组用来描述如何生成一个对象的代码段.在P ...

  7. 理解Python中的元类(metaclass)

    类也是对象 在理解元类之前,你需要先掌握Python中的类.Python中类的概念借鉴于Smalltalk,这显得有些奇特.在大多数编程语言中,类就是一组用来描述如何生成一个对象的代码段.在Pytho ...

  8. Python元类(type()和metaclass)

    1. 元类是什么 众所周知,对象由类实例化而来,类是对象的模板,而python一切皆对象,类也是对象,它由元类(type)创建,所以元类是类的类,是类的模板 2. 创建类的另一种方法 一般情况下,我们 ...

  9. python3元类简介(metaclass)

    在Python中可以用内置函数type查看对象的类型,isinstance查看某个对象是某个类实例,通过type可以实现动态类,以及通过metaclass实现动态类 type()与isinstance ...

最新文章

  1. 在leangoo项目里怎么批量导入成员,更改项目成员权限,移除项目成员?
  2. quick cocos2d-x 使用CCTableView 例子
  3. 河南大学明德计划2020计算机学院,关于选拔2020级物理学“明德计划”实验班学生的通知...
  4. DedeCMS(织梦)安全设置经验分享
  5. 最短Hamilton路径与旅行商问题联系与解决
  6. 事件内核对象 CreateEvent
  7. 大数据是企业未来最重要的资源
  8. gms签名不一致_电子签名拍照-多媒体互动装置介绍「振邦视界」
  9. 讲真,灾备的内涵其实很丰富
  10. .NET下解析Json的方法
  11. 台式计算机 评标细则,计算机评标系统流程.doc
  12. 台式电脑计算机怎么用,怎么用键盘开机电脑_台式电脑键盘怎么开机-win7之家
  13. L1-005. 考试座位号
  14. Arco Design - 企业级产品的完整设计和开发解决方案
  15. 极速office(Word)如何在表格里面插入行或者列
  16. UE4 Gameplay框架浅析笔记
  17. 人文笔记(芒格人类误判心理学 + 韩信研究)
  18. S5PV210 led.bin Makefile 浅析
  19. INPUT输入框灰体提示
  20. 谈谈mysql locate函数

热门文章

  1. oracle 10grac搭建,新建虚拟机 - Vmware+Linux+Oracle 10G RAC全程详细图解_数据库技术_Linux公社-Linux系统门户网站...
  2. 安装oracle 权限不够,安装libtool,提示权限不够
  3. 我国私有云发展进入快车道,云宏等厂商将逐步取代国外大厂
  4. Tech Tuesday 22-5-31 小波分析在信号特征提取中的应用(1)
  5. 《软件质量保证与测试》课程的学习
  6. js判断页面是否处于选中状态啊
  7. Python之tkinter图形界面设计学习二
  8. 2021年机械员-岗位技能(机械员)考试题及机械员-岗位技能(机械员)试题及解析
  9. P3674 小清新人渣的本愿 (bitset+莫队)
  10. 抖音点赞最多的标题_抖音吸引眼球的标题 抖音点赞高的句子