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

网站制作与建设与网页制作自主网站建站

网站制作与建设与网页制作,自主网站建站,wordpress qux,防蜘蛛抓取网站代码上一篇介绍了 Python 枚举类型的标准库#xff0c;除了考虑到其实用性#xff0c;还有一个重要的原因是其实现过程是一个非常好的学习、理解 Python 类与元类的例子。因此接下来两篇就以此为例#xff0c;深入挖掘 Python 中类与元类背后的机制。翻开任何一本 Python 教程除了考虑到其实用性还有一个重要的原因是其实现过程是一个非常好的学习、理解 Python 类与元类的例子。因此接下来两篇就以此为例深入挖掘 Python 中类与元类背后的机制。翻开任何一本 Python 教程你一定可以在某个位置看到下面这两句话Python 中一切皆为对象(Everything in Python is an object);Python 是一种面向对象编程(Object Oriented Programming, OOP)的语言。虽然在上面两句话的语境中对象(Object)的含义可能稍有不同但可以肯定的是对象在 Python 中具有非常重要的意义也是我们接下来将要讨论的所有内容的基础。那么对象到底是什么?对象(Object)对象是 Python 中对数据的一种抽象Python 程序中所有数据都是通过对象或对象之间的关系来表示的。[ref: Data Model]港台将 Object 翻译为“物件”可以将其看作是一个盛有数据的盒子只不过除了纯粹的数据之外还有其它有用的属性信息在 Python 中所有的对象都具有id、type、value三个属性---------------| || Python Object || |--------------| ID | |---------------| Type | |---------------| Value| |---------------其中 id 代表内存地址可以通过内置函数 id()查看而type表示对象的类别不同的类别意味着该对象拥有的属性和方法等可以通过 type()方法查看def who(obj):print(id(obj), type(obj))who(1)who(None)who(who)451508836845148123444542646064对象作为 Python 中的基本单位可以被创建、命名或删除。Python 中一般不需要手动删除对象其垃圾回收机制会自动处理不再使用的对象当然如果需要也可以使用 del 语句删除某个变量;所谓命名则是指给对象贴上一个名字标签方便使用也就是声明或赋值变量;接下来我们重点来看如何创建一个对象。对于一些 Python 内置类型的对象通常可以使用特定的语法生成例如数字直接使用阿拉伯数字字面量字符串使用引号 列表使用 []字典使用 {} 函数使用 def 语法等这些对象的类型都是 Python 内置的那我们能不能创建其它类型的对象呢?类与实例既然说 Python 是面向对象编程语言也就允许用户自己创建对象通常使用 class 语句与其它对象不同的是class 定义的对象(称之为类)可以用于产生新的对象(称之为实例)class A:passa A()who(A)who(a)1404777039446164542635424上面的例子中 A 是我们创建的一个新的类而通过调用 A() 可以获得一个 A 类型的实例对象我们将其赋值为 a也就是说我们成功创建了一个与所有内置对象类型不同的对象 a它的类型为 __main__.A!至此我们可以将 Python 中一切的对象分为两种可以用来生成新对象的类包括内置的 int、str 以及自己定义的 A 等;由类生成的实例对象包括内置类型的数字、字符串以及自己定义的类型为 __main__.A 的 a。单纯从概念上理解这两种对象没有任何问题但是这里要讨论的是在实践中不得不考虑的一些细节性问题需要一些方便的机制来实现面向对象编程中的继承、重载等特性;需要一些固定的流程让我们可以在生成实例化对象的过程中执行一些特定的操作;这两个问题主要关于类的一些特殊的操作也就是这一篇后面的主要内容。如果再回顾一下开头提到的两句话你可能会想到既然类本身也是对象那它们又是怎样生成的?这就是后一篇将主要讨论的问题用于生成类对象的类即元类(Metaclass)。super, mro()0x00Python 之禅中提到的最后一条命名空间(namespace)是个绝妙的理念类或对象在 Python 中就承担了一部分命名空间的作用。比如说某些特定的方法或属性只有特定类型的对象才有不同类型对象的属性和方法尽管名字可能相同但由于隶属不同的命名空间其值可能完全不同。在实现类的继承与重载等特性时同样需要考虑命名空间的问题以枚举类型的实现为例我们需要保证枚举对象的属性名称不能有重复因此我们需要继承内置的 dict 类class _EnumDict(dict):def __init__(self):dict.__init__(self)self._member_names []def keys(self):keys dict.keys(self)return list(filter(lambda k: k.isupper(), keys))ed _EnumDict()ed[RED] 1ed[red] 2print(ed, ed.keys()){RED: 1, red: 2} [RED]在上面的例子中 _EnumDict 重载同时调用了父类 dict的一些方法上面的写法在语法上是没有错误的但是如果我们要改变 _EnumDict 的父类不再是继承自 dict则必须手动修改所有方法中 dict.method(self) 的调用形式这样就不是一个好的实践方案了。为了解决这一问题Python 提供了一个内置函数 super()print(super.__doc__)super() - same as super(__class__, )super(type) - unbound super objectsuper(type, obj) - bound super object; requires isinstance(obj, type)super(type, type2) - bound super object; requires issubclass(type2, type)Typical use to call a cooperative superclass method:class C(B):def meth(self, arg):super().meth(arg)This works for class methods too:class C(B):classmethoddef cmeth(cls, arg):super().cmeth(arg)我最初只是把 super() 当做指向父类对象的指针但实际上它可以提供更多功能给定一个对象及其子类(这里对象要求至少是类对象而子类可以是实例对象)从该对象父类的命名空间开始搜索对应的方法。以下面的代码为例class A(object):def method(self):who(self)print(A.method)class B(A):def method(self):who(self)print(B.method)class C(B):def method(self):who(self)print(C.method)class D(C):def __init__(self):super().method()super(__class__, self).method()super(C, self).method() # calling Cs parents methodsuper(B, self).method() # calling Bs parents methodsuper(B, C()).method() # calling Bs parents method with instance of Cd D()print(\nInstance of D:)who(d)4542787992C.method4542787992C.method4542787992B.method4542787992A.method4542788048A.methodInstance of D:4542787992当然我们也可以在外部使用 super() 方法只是不能再用缺省参数的形式因为在外部的命名空间中不再存在 __class__和 selfsuper(D, d).method() # calling Ds parents method with instance d4542787992C.method上面的例子可以用下图来描述----------| A |----------| method() ---------- ||---------- ----------| B | | D |---------- super(C,self) ----------| method() ---------- ----------|---------- || C | |---------- | super(D,self)| method() ----------可以认为 super()方法通过向父类方向回溯给我们找到了变量搜寻的起点但是这个回溯的顺序是如何确定的呢?上面的例子中继承关系是 object-A-B-C-D 的顺序如果是比较复杂的继承关系呢?class A(object):passclass B(A):def method(self):print(Bs method)class C(A):def method(self):print(Cs method)class D(B, C):def __init__(self):super().method()class E(C, B):def __init__(self):super().method()d D()e E()Bs methodCs methodPython 中提供了一个类方法mro()可以指定搜寻的顺序mro 是Method Resolution Order的缩写它是类方法而不是实例方法可以通过重载 mro() 方法改变继承中的方法解析顺序但这需要在元类中完成在这里只看一下其结果D.mro()[__main__.D, __main__.B, __main__.C, __main__.A, object]E.mro()[__main__.E, __main__.C, __main__.B, __main__.A, object]super() 方法就是沿着 mro() 给出的顺序向上寻找起点的super(D, d).method()super(E, e).method()Bs methodCs methodsuper(C, e).method()super(B, d).method()Bs methodCs method
http://www.zqtcl.cn/news/856645/

相关文章:

  • 郑州中森网站建设免费网站app生成软件
  • 做诚信通网站seo新手快速入门
  • 做网站怎么去找客户带会员中心WordPress免费主题
  • 网站建设资费安平县护栏网站建设
  • 做视频网站侵权吗个体户网站备案
  • 苏州姑苏区建设局网站智慧团建登录官网手机版
  • 如何搭建一个视频网站广告制作方案
  • 网站策划ps苏州建站公司速找苏州聚尚网络
  • 网站备案 关闭客户制作网站时的问题
  • 项目网站分析推荐做ppt照片的网站
  • wordpress注明网站网站建设需要什么手续
  • 厦门过路费网站福建省建设执业资格注册中心网站
  • c 网站开发案例详解手机网站返回顶部代码
  • 济南微网站建设图书馆评估定级关于网站建设标准
  • flash型网站宝塔面板做网站绑定域名
  • 建设网站的策划书门户网站 流量
  • 佛山高端网站建设便宜自适应网站建设
  • 网络营销创意案例桂林seo公司推荐23火星
  • 网站开发知识产权归属问题wordpress会计模板下载
  • 昆明网站的优化自媒体是干什么的
  • 大成建设株式会社网站删掉wordpress主题
  • 个人网站备案类型网络维护培训班
  • 做网站的可以注册个工作室吗一个网站两个域名吗
  • 网站建设要准备什么资料网站建设 锐颖科技
  • 如何建设网站山东济南兴田德润官网电子商城官网
  • 网站如何做支付宝接口免费ppt自动生成器
  • 泰安市建设职工培训中心网站官网seo经理招聘
  • 湛江做网站seo网站建设 0551
  • 建站公司 深圳苏州建站公司
  • 网站怎么做引流呢济南网站微信