类的继承,主要涉及   类之间关系。

元类metaclass,某种意思上可以理解为类的父类;类是元类的实例。

第一:type函数创建类

在python中,类也是对象。既然是类是对象,必然有个存在生成它。那么什么东西创建了类?

答案是type。

怎么去理解?

eg:str,这个可以创建字符串,类比下type可以创建类。

type函数可以查看某个对象,属于哪个类。

type(str)

第二:利用关键字class 创建类

class animals(object):def __init__(self,animal,animal_taxonomy):self.animal=animalself.animal_taxonomy=animal_taxonomydef animal_class(self):print('earth animal %s'%self.animal)
u=animals('diqiu','dongwu')
u.animal_class

第三:利用type函数创建类

type(类名, 父类的元组(针对继承的情况,可以为空),包含属性的字典(名称和值)

字典的key,为属性;value为对应的方法【可以是定义的函数需要self,但是def cc(self,)】

利用type函数,手动创建类,不方便,写的代码多,人又懒,,,,

def animal_class(self,animal,animal_taxonomy):print('earth animal %s' % animal)animals2=type('animals2',(),{'animal_class':animal_class})
u=animals2()
print(u.animal_class('ddd','cccccc'))

通过type()函数创建的类和直接写class是完全一样的,因为Python解释器遇到class定义时,仅仅是扫描一下class定义的语法,然后调用type()函数创建出class

第四:mateclass

除了使用type()动态创建类以外,要控制类的创建行为,还可以使用metaclass。

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

因为:type(类名, 父类的元组(针对继承的情况,可以为空),包含属性的字典(名称和值)

我们可以在,创造类的时候,在其包含属性的字典中自由添加相关属性。

  • 但因为,type函数创建类还是不太方便,所以python为你们想好了,就出了个关键字class。
  • 在既然出了关键字class,那么python又给你更进一步想好了,把type定义类的三个模块【类名,父类,属性】封装到__new__方法中;而__new__又封装在__mateclass__中。
  • 默认的__mateclass__中的__new__方法,包含cls、name、bases、attrs。
  • 创建类,就是利用__mateclass__中的__new__方法来实现的,新增加属性,就在attrs这个字典中添加。

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

1、自定义metaclass元类,实现特定的功能【主要就是改写__new__方法】

  • 区别于__init__方法,需要return 改写后的__new__方法【这个和继承改写__init__构造函数相类似】
  • 重点在于__new__需要传入四个参数,自定义的时候,必须传入四个参数,且类型要一致。
  • eval('self.{}()'.format(callback)),self.{}()需要加(),否则只是引用方法的地址,方法并没有执行

class a(type):def __new__(cls, name,bases,attrs):"""new 的参数数量一致即可,因为最终return 数量一致,即可以,对得上_new_中从参数:param name::param bases::param attrs::return:"""count=0attrs['__skiless__']=[]for k,y in attrs.items():if 'acc' in k:attrs['__skiless__'].append(k)count+=1attrs['__a_count__']=countreturn type.__new__(cls,name,bases,attrs)class ppp(object,metaclass=a):@classmethoddef get(self):kkk=[]kkk.append(self.__skiless__)return kkkdef gettt(self,callback):hh=[]hh.append(eval('self.{}()'.format(callback)))return hhdef acc(self):return 'a1'def acc2(self):return 'a2'd=ppp()
d.get()
print(d.get())
for i in d.__skiless__:print(d.gettt(i))

python的元类与类继承的区别相关推荐

  1. python元类是什么_谈谈Python中元类Metaclass(一):什么是元类

    简单的讲,元类创建了Python中所有的对象. 我们说Python是一种动态语言,而动态语言和静态语言最大的不同,就是函数和类不是编译时定义的,而是运行时动态创建的. 比方说我们要定义一个HelloW ...

  2. 读书笔记:《流畅的Python》第21章 类元编程

    # 第21章 类元编程""" 类元编程指的是运行时创建或定制类的技艺1.类是一等对象,任何时候都可以使用函数新建类,而无需使用class关键字2.类装饰器也是函数,不过能 ...

  3. python类的继承关系,python——类和类之间的关系(继承多态)

    1.类和类之间的关系有三种:is-a.has-a和use-a关系. is-a关系也叫继承或泛化,比如学生和人的关系.手机和电子产品的关系都属于继承关系. has-a关系通常称之为关联,比如部门和员工的 ...

  4. Python进阶:理解元类创建类ABCMeta

    Python进阶:Python进阶:理解元类创建类ABCMeta 一.理解元类(Meta class) 1.1 元类直观理解 1.2 Python官方文档给出的元类描述 二.理解抽象基类(ABC, A ...

  5. python定义方法继承类_Python类的定义、继承及类对象使用方法简明教程

    Python编程中类的概念可以比作是某种类型集合的描述,如"人类"可以被看作一个类,然后用人类这个类定义出每个具体的人--你.我.他等作为其对象.类还拥有属性和功能,属性即类本身的 ...

  6. python中组合与继承的区别_python类与对象的组合与继承

    1.把类的对象实例化放到一个新的类里面叫做类的组合,组合就是指几个横向关系的类放在一起,纵向关系的类放在一起是继承,根据实际应用场景确定.简单的说,组合用于"有一个"的场景中,继承 ...

  7. python定义一个人类_Python类的定义、继承及类对象使用方法简明教程

    Python编程中类的概念可以比作是某种类型集合的描述,如"人类"可以被看作一个类,然后用人类这个类定义出每个具体的人--你.我.他等作为其对象.类还拥有属性和功能,属性即类本身的 ...

  8. 【python】详解类class的继承、__init__初始化、super方法

    原文链接; https://blog.csdn.net/brucewong0516/article/details/79121179?utm_medium=distribute.pc_relevant ...

  9. python 基类 派生类_在Python中具有两个子(派生)类的继承示例

    python 基类 派生类 In this program, we have a parent class named Details and two child classes named Empl ...

  10. 【python】-- 类的继承(新式类/经典类)、多态

    继承 之前我们说到了类的公有属性和类的私有属性,其实就是类的封装,现在准备随笔的 是继承,是面向对象的第二大特性. 面向对象编程 (OOP) 语言的一个主要功能就是"继承".继承是 ...

最新文章

  1. 如何优雅地使用pdpipe与Pandas构建管道?
  2. docker~dockertoolbox的加速器
  3. python零基础怎么学-python 零基础该怎么学?
  4. 【杂谈】有三AI专栏作者邀请,在这里写文章能获得什么,有什么不同?
  5. Shopee上线全球类目树,类目垂直定位,让商家引流更精准!
  6. java spring 登录验证_详解使用Spring3 实现用户登录以及权限认证
  7. c语言设计匀速直线运动,C语言课程设计指导书2015版(试用版)201506.doc
  8. “中文直达”能推动移动上网入口洗牌吗?
  9. 5.微服务:从设计到部署 --- 事件驱动数据管理
  10. 加密+拜占庭将军_简单读懂拜占庭容错
  11. XcodeGhost作者声明:源于实验,无任何威胁
  12. numpy保存npy
  13. 纸鸢|物联网云平台产品设计思路
  14. tcp-ip网络模型-物理层
  15. zbrush常用笔刷_Zbrush各笔刷特性
  16. 第11届蓝桥杯本科组校赛
  17. POS58票据热敏打印机,怎么用ESC/POS命令控制打印
  18. 人脑能用计算机算法吗,电脑到人脑,计算机必不可少的4大思维
  19. 1879: Intersection
  20. 【老生谈算法】matlab实现轮盘赌算法-Roulette——轮盘赌算法

热门文章

  1. Android S 修改关于手机的logo
  2. 超级右键-右键功能不显示解决方案
  3. Linux动态查看时间
  4. cf训练赛20190806
  5. id主键的创建及作用
  6. 凸包 (Convex Hull)
  7. 持续集成工具 jenkins
  8. Python-Web后端框架:Flask
  9. 百度API--通过ip地址定位
  10. 计算从某个日期开始往前或往后天数的日期