当前位置: 首页 > news >正文

网站开发语言字典服务器怎么建设网站

网站开发语言字典,服务器怎么建设网站,广州微信网站开发公司,怎么把一个网站的关键词目录 一、引言二、什么是元类三、为什么用元类四、内置函数exec(储备)五、class创建类5.1 type实现六、自定义元类控制类的创建6.1 应用七、__call__(储备)八、__new__(储备)九、自定义元类控制类的实例化一十、自定义元类后类的继承顺序十一、练习一、引言 元类属于python面向… 目录 一、引言二、什么是元类三、为什么用元类四、内置函数exec(储备)五、class创建类5.1 type实现六、自定义元类控制类的创建6.1 应用七、__call__(储备)八、__new__(储备)九、自定义元类控制类的实例化一十、自定义元类后类的继承顺序十一、练习 一、引言 元类属于python面向对象编程的深层魔法99%的人都不得要领一些自以为搞明白元类的人其实也只是自圆其说、点到为止从对元类的控制上来看就破绽百出、逻辑混乱今天我就来带大家来深度了解python元类的来龙去脉。笔者深入浅出的背后是对技术一日复一日的执念希望可以大家可以尊重原创为大家能因此文而解开对元类所有的疑惑而感到开心二、什么是元类 在python中一切皆对象那么我们用class关键字定义的类本身也是一个对象负责产生该对象的类称之为元类即元类可以简称为类的类class Foo: # Foo元类()pass 三、为什么用元类 元类是负责产生类的所以我们学习元类或者自定义元类的目的是为了控制类的产生过程还可以控制对象的产生过程四、内置函数exec(储备) cmd x1 print(exec函数运行了) def func(self):passclass_dic {} # 执行cmd中的代码然后把产生的名字丢入class_dic字典中 exec(cmd, {}, class_dic) exec函数运行了 print(class_dic) {x: 1, func: function func at 0x10a0bc048} 五、class创建类 如果说类也是对象那么用class关键字的去创建类的过程也是一个实例化的过程该实例化的目的是为了得到一个类调用的是元类用class关键字创建一个类用的默认的元类type因此以前说不要用type作为类别判断class People: # Peopletype(...)country Chinadef __init__(self, name, age):self.name nameself.age agedef eat(self):print(%s is eating % self.name) print(type(People)) class type 5.1 type实现 创建类的3个要素类名基类类的名称空间People type(类名基类类的名称空间)class_name People # 类名class_bases (object, ) # 基类# 类的名称空间 class_dic {} class_body countryChina def __init__(self,name,age):self.namenameself.ageage def eat(self):print(%s is eating %self.name) exec(class_body,{},class_dic, ) print(class_name) People print(class_bases) (class object,) print(class_dic) # 类的名称空间 {country: China, __init__: function __init__ at 0x10a0bc048, eat: function eat at 0x10a0bcd08} People type(类名基类类的名称空间)People1 type(class_name, class_bases, class_dic) print(People1) class __main__.People obj1 People1(1, 2) obj1.eat() 1 is eating class创建的类的调用print(People) class __main__.People obj People1(1, 2) obj.eat() 1 is eating 六、自定义元类控制类的创建 使用自定义的元类class Mymeta(type): # 只有继承了type类才能称之为一个元类否则就是一个普通的自定义类def __init__(self, class_name, class_bases, class_dic):print(self:, self) # 现在是Peopleprint(class_name:, class_name)print(class_bases:, class_bases)print(class_dic:, class_dic)super(Mymeta, self).__init__(class_name, class_bases,class_dic) # 重用父类type的功能 分析用class自定义类的运行原理而非元类的的运行原理 拿到一个字符串格式的类名class_namePeople拿到一个类的基类们class_bases(obejct,)执行类体代码拿到一个类的名称空间class_dic{...}调用Peopletype(class_name,class_bases,class_dic)class People(object, metaclassMymeta): # PeopleMymeta(类名,基类们,类的名称空间)country Chinadef __init__(self, name, age):self.name nameself.age agedef eat(self):print(%s is eating % self.name) self: class __main__.People class_name: People class_bases: (class object,) class_dic: {__module__: __main__, __qualname__: People, country: China, __init__: function People.__init__ at 0x10a0bcbf8, eat: function People.eat at 0x10a0bc2f0} 6.1 应用 自定义元类控制类的产生过程类的产生过程其实就是元类的调用过程我们可以控制类必须有文档可以使用如下的方式实现class Mymeta(type): # 只有继承了type类才能称之为一个元类否则就是一个普通的自定义类def __init__(self, class_name, class_bases, class_dic):if class_dic.get(__doc__) is None or len(class_dic.get(__doc__).strip()) 0:raise TypeError(类中必须有文档注释并且文档注释不能为空)if not class_name.istitle():raise TypeError(类名首字母必须大写)super(Mymeta, self).__init__(class_name, class_bases,class_dic) # 重用父类的功能 try:class People(object, metaclassMymeta): #People Mymeta(People,(object,),{....})# 这是People类country Chinadef __init__(self, name, age):self.name nameself.age agedef eat(self):print(%s is eating % self.name) except Exception as e:print(e) 类中必须有文档注释并且文档注释不能为空 七、__call__(储备) 要想让obj这个对象变成一个可调用的对象需要在该对象的类中定义一个方法、、__call__方法该方法会在调用对象时自动触发class Foo:def __call__(self, *args, **kwargs):print(args)print(kwargs)print(__call__实现了实例化对象可以加括号调用了)obj Foo() obj(nick, age18) (nick,) {age: 18} __call__实现了实例化对象可以加括号调用了 八、__new__(储备) 我们之前说类实例化第一个调用的是__init__但__init__其实不是实例化一个类的时候第一个被调用 的方法。当使用 Persion(name, age) 这样的表达式来实例化一个类时最先被调用的方法 其实是 __new__ 方法。 __new__方法接受的参数虽然也是和__init__一样但__init__是在类实例创建之后调用而 __new__方法正是创建这个类实例的方法。 注意new() 函数只能用于从object继承的新式类。 class A:passclass B(A):def __new__(cls):print(__new__方法被执行)return cls.__new__(cls)def __init__(self):print(__init__方法被执行)b B() 九、自定义元类控制类的实例化 class Mymeta(type):def __call__(self, *args, **kwargs):print(self) # self是Peopleprint(args) # args (nick,)print(kwargs) # kwargs {age:18}# return 123# 1. 先造出一个People的空对象申请内存空间# __new__方法接受的参数虽然也是和__init__一样但__init__是在类实例创建之后调用而 __new__方法正是创建这个类实例的方法。obj self.__new__(self) # 虽然和下面同样是People但是People没有找到的__new__是父类的# 2. 为该对空对象初始化独有的属性self.__init__(obj, *args, **kwargs)# 3. 返回一个初始化好的对象return obj People Mymeta()People()则会触发__call__class People(object, metaclassMymeta):country Chinadef __init__(self, name, age):self.name nameself.age agedef eat(self):print(%s is eating % self.name)# 在调用Mymeta的__call__的时候首先会找自己如下函数的自己的没有才会找父类的 # def __new__(cls, *args, **kwargs): # # print(cls) # cls是People # # cls.__new__(cls) # 错误无限死循环自己找自己的会无限递归 # obj super(People, cls).__new__(cls) # 使用父类的则是去父类中找__new__ # return obj 类的调用即类实例化就是元类的调用过程可以通过元类Mymeta的__call__方法控制分析调用Pepole的目的 先造出一个People的空对象为该对空对象初始化独有的属性返回一个初始化好的对象obj People(nick, age18) class __main__.People (nick,) {age: 18} print(obj.__dict__) {name: nick, age: 18} 一十、自定义元类后类的继承顺序 结合python继承的实现原理元类重新看属性的查找应该是什么样子呢 在学习完元类后其实我们用class自定义的类也全都是对象包括object类本身也是元类type的 一个实例可以用type(object)查看我们学习过继承的实现原理如果把类当成对象去看将下述继承应该说成是对象OldboyTeacher继承对象Foo对象Foo继承对象Bar对象Bar继承对象object class Mymeta(type): # 只有继承了type类才能称之为一个元类否则就是一个普通的自定义类n 444def __call__(self, *args,**kwargs): #selfclass __main__.OldboyTeacherobj self.__new__(self)self.__init__(obj, *args, **kwargs)return objclass Bar(object):n 333class Foo(Bar):n 222class OldboyTeacher(Foo, metaclassMymeta):n 111school oldboydef __init__(self, name, age):self.name nameself.age agedef say(self):print(%s says welcome to the oldboy to learn Python % self.name)print(OldboyTeacher.n ) # 自下而上依次注释各个类中的nxxx然后重新运行程序发现n的查找顺序为OldboyTeacher-Foo-Bar-object-Mymeta-type 111 print(OldboyTeacher.n) 111 查找顺序 先对象层OldoyTeacher-Foo-Bar-object然后元类层Mymeta-type依据上述总结我们来分析下元类Mymeta中__call__里的self.__new__的查找 class Mymeta(type):n 444def __call__(self, *args,**kwargs): #selfclass __main__.OldboyTeacherobj self.__new__(self)print(self.__new__ is object.__new__) #Trueclass Bar(object):n 333# def __new__(cls, *args, **kwargs):# print(Bar.__new__)class Foo(Bar):n 222# def __new__(cls, *args, **kwargs):# print(Foo.__new__)class OldboyTeacher(Foo, metaclassMymeta):n 111school oldboydef __init__(self, name, age):self.name nameself.age agedef say(self):print(%s says welcome to the oldboy to learn Python % self.name)# def __new__(cls, *args, **kwargs):# print(OldboyTeacher.__new__)OldboyTeacher(nick,18) # 触发OldboyTeacher的类中的__call__方法的执行进而执行self.__new__开始查找 总结Mymeta下的__call__里的self.__new__在OldboyTeacher、Foo、Bar里都没有找到__new__的情况下会去找object里的__new__而object下默认就有一个__new__所以即便是之前的类均未实现__new__,也一定会在object中找到一个根本不会、也根本没必要再去找元类Mymeta-type中查找__new__ 十一、练习 需求使用元类修改属性为隐藏属性 class Mymeta(type):def __init__(self, class_name, class_bases, class_dic):# 加上逻辑控制类Foo的创建super(Mymeta, self).__init__(class_name, class_bases, class_dic)def __call__(self, *args, **kwargs):# 加上逻辑控制Foo的调用过程即Foo对象的产生过程obj self.__new__(self)self.__init__(obj, *args, **kwargs)# 修改属性为隐藏属性obj.__dict__ {_%s__%s % (self.__name__, k): vfor k, v in obj.__dict__.items()}return obj class Foo(object, metaclassMymeta): # Foo Mymeta(...)def __init__(self, name, age, sex):self.name nameself.age ageself.sex sexobj Foo(nick, 18, male) print(obj.__dict__) {_Foo__name: egon, _Foo__age: 18, _Foo__sex: male}转载于:https://www.cnblogs.com/nickchen121/p/10992975.html
http://www.pierceye.com/news/458557/

相关文章:

  • 怎样建设自己的视频网站首页电子商务网站开发教程论文6
  • 推荐一个做照片书的网站湛江网站建设招聘
  • 厦门建网站网址ai自动设计logo
  • 蓝色织梦cms企业网站模板全站源码招聘类网站如何做
  • 郑州建设银行网站wordpress数据库怎么设置
  • 电子商务网站实例php网站建设哪家好
  • 网站开发课程报告心得简单的网页设计作品欣赏
  • 网站建设用什么系统华为弹性云做网站
  • 莱芜高端网站建设报价网站色彩策划
  • 房地产项目网站做网站互联网公司有哪些
  • 凡科做网站友情链接怎么做wordpress广告位设置
  • org已经备案的网站wap网站建设服务
  • 企业网站模板免费下载企业网站模板免费完整版的网站模板
  • 外贸网站建设公司价格怎样做触屏版手机网站
  • 南宁站建好就够用秦皇岛微信推广平台
  • 物流公司做网站有用吗河北省住房和城乡建设网站
  • 网站举报官网seo站长论坛
  • 建站工具有哪些论坛网站建设总体要求
  • 公司网页网站建设 pptwordpress php 采集
  • 遵义网站开发公司舟山网站建设企业
  • 外贸网站一站式服务招网站建设销售
  • 绚丽的网站wordpress进入后台显示500
  • 威海城乡与住房建设部网站小颜自助建站系统
  • 域名怎么解析到网站做响应式网站需要学哪些知识
  • wordpress手机端慢seoer是什么意思
  • wordpress添加站点江苏廉政建设网站
  • 网站seo是什么做二维码推送网站
  • win7 iis默认网站设置游戏推广员
  • 湖北二师网站建设排名潍坊专业捞泵电话
  • 个人网站设计内容和要求萍乡网站制作公司