博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
元类补充-属性查找
阅读量:5132 次
发布时间:2019-06-13

本文共 1593 字,大约阅读时间需要 5 分钟。

查找顺序:  一切皆对象,把Foo,B,A都看成对象  先在对象层找,如果对象层没有,再去元类层找,先Mymeta,再type  1、先对象层:Foo->B->A->object  2、然后元类层:Mymeta->type

 

class Mymeta(type):    n = 444    def __call__(self, *args, **kwargs):        obj = self.__new__(self)  # self=Foo        self.__init__(obj, *args, **kwargs)        return objclass A(object):    n = 333class B(A):    n = 222class Foo(B, metaclass=Mymeta):  # Foo=Mymeta(...)    n = 111    def __init__(self, x, y):        self.x = x        self.y = yprint(Foo.n)print(type(object))obj = Foo(1, 2)print(obj.__dict__)  # {"x":1,"y":2}

 

作者:权循真
链接:https://www.zhihu.com/question/19754941/answer/12860775
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

首先是单下划线开头,这个被常用于模块中,在一个模块中以单下划线开头的变量和函数被默认当作内部函数,如果使用 from a_module import * 导入时,这部分变量和函数不会被导入。不过值得注意的是,如果使用 import a_module 这样导入模块,仍然可以用 a_module._some_var 这样的形式访问到这样的对象。

在 Python 的官方推荐的代码样式中,还有一种单下划线结尾的样式,这在解析时并没有特别的含义,但通常用于和 Python 关键词区分开来,比如如果我们需要一个变量叫做 class,但 class 是 Python 的关键词,就可以以单下划线结尾写作 class_。

双下划线开头的命名形式在 Python 的类成员中使用表示名字改编 (Name Mangling),即如果有一 Test 类里有一成员 __x,那么 dir(Test) 时会看到 _Test__x 而非 __x。这是为了避免该成员的名称与子类中的名称冲突。但要注意这要求该名称末尾没有下划线。

双下划线开头双下划线结尾的是一些 Python 的“魔术”对象,如类成员的 __init__、__del__、__add__、__getitem__ 等,以及全局的 __file__、__name__ 等。 Python 官方推荐永远不要将这样的命名方式应用于自己的变量或函数,而是按照文档说明来使用。

另外单下划线开头还有一种一般不会用到的情况在于使用一个 C 编写的扩展库有时会用下划线开头命名,然后使用一个去掉下划线的 Python 模块进行包装。如 struct 这个模块实际上是 C 模块 _struct 的一个 Python 包装。

更多关于命名的内容可以参考 PEP 8 《代码风格指南》的 Name Conventions 一节:

需要说明的是,由于这份文档看起来经过多次修改,双下划线开头的用法似乎曾经如 @makestory 所说,建议为类的私有成员,至少啄木鸟社区的 PEP 8 译文是这样写的,但 PEP 8 当前的官方版本中并没有体现。

转载于:https://www.cnblogs.com/Roc-Atlantis/p/9254163.html

你可能感兴趣的文章
treegrid.bootstrap使用说明
查看>>
[Docker]Docker拉取,上传镜像到Harbor仓库
查看>>
javascript 浏览器类型检测
查看>>
nginx 不带www到www域名的重定向
查看>>
记录:Android中StackOverflow的问题
查看>>
导航,头部,CSS基础
查看>>
[草稿]挂载新硬盘
查看>>
[USACO 2017 Feb Gold] Tutorial
查看>>
关于mysql中GROUP_CONCAT函数的使用
查看>>
OD使用教程20 - 调试篇20
查看>>
Java虚拟机(JVM)默认字符集详解
查看>>
Java Servlet 过滤器与 springmvc 拦截器的区别?
查看>>
(tmp >> 8) & 0xff;
查看>>
linux命令之ifconfig详细解释
查看>>
NAT地址转换
查看>>
Nhibernate 过长的字符串报错 dehydration property
查看>>
Deque - leetcode 【双端队列】
查看>>
gulp插件gulp-ruby-sass和livereload插件
查看>>
免费的大数据学习资料,这一份就足够
查看>>
clientWidth、clientHeight、offsetWidth、offsetHeight以及scrollWidth、scrollHeight
查看>>