- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章举例讲解Python中metaclass元类的创建与使用由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
元类是可以让你定义某些类是如何被创建的。从根本上说,赋予你如何创建类的控制权。 元类也是一个类,是一个type类。 元类一般用于创建类。在执行类定义时,解释器必须要知道这个类的正确的元类,如果此属性没有定义,它会向上查找父类中的__metaclass__属性。如果还没发现,就查找全局变量。 对于传统类来说,它们的元类是types.ClassType。 元类也有构造器,传递三个参数:类名,从基类继承数据的元组,和类属性字典。 下面我们来定义一个元类,要求写类的时候必须给类提供一个__str__()方法,如果没有提供__repr__()方法, 则给你警告.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
from
warnings
import
warn
#元类需要继承type类
class
ReqStrSugRepr(
type
):
def
__init__(
cls
, name, bases, attrd):
#构造函数需要传递的参数为类名,基类,类属性字典
super
(ReqStrSugRepr,
cls
).__init__(name, bases, attrd)
# 判断__str__字符串是否在类的属性字典里
if
'__str__'
not
in
attrd:
raise
TypeError(
'Class requires overriding of __str__()'
)
if
'__repr__'
not
in
attrd:
warn(
'Class suggests overriding of __repr__()\n'
, stacklevel
=
3
)
class
Foo(
object
):
#给类指定元类
__metaclass__
=
ReqStrSugRepr
def
foo(
self
):
pass
#这一段代码不用创建类来测试,直接运行一下就会报错,可见元类的功力。
|
type 。
type函数可以查看一个变量的类型, 比如
1
2
3
4
|
# <type 'int'>
# <type 'str'>
type
(
1
)
type
(
'mink'
)
|
type函数还可以创建一个新的对象 type接受三个参数,name, bases, dict 第一个接受类名,第二个参数接受父类(元组形式),第三个参数接受属性和方法(字典形式) 。
1
2
3
4
|
X
=
type
(
'X'
, (
object
,),
dict
(a
=
1
))
# 等于
class
X(
object
):
a
=
1
|
下面是接受函数的方法 。
1
2
3
4
5
6
7
8
|
def
say(
self
):
print
'hello'
X
=
type
(
'X'
, (
object
,),
dict
(say
=
say))
x
=
X()
# pirnt hello
x.say()
|
元类 。
我们都知道通过类可以创建处实例对象,而元类就是创建出类对象的类。type可以创建出类对象也就是说type就是一个元类.
metaclass 属性 。
如果想使用元类创建类对象就需要对该对象添加一个__metaclass__属性。当然你首先得有一个元类 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
class
PrivateMetaclass(
type
):
def
__new__(
cls
, name, parents, attrs):
attrs
=
dict
((
'__%s'
%
k, v)
for
k, v
in
attrs.itmes())
return
super
(PrivateMetaclass,
cls
).__new__(
cls
, name, parents, attrs)
class
A(
object
):
__metaclass__
=
PrivateMetaclass
a
=
1
b
=
2
a
=
A()
# raise AttributeError
print
a.a, a.b
# print 1, 2
print
a.__a, a.__b
|
这样你就可以通过元类来修改类的一些特性,上面的就是修改变量为私有变量. 。
最后此篇关于举例讲解Python中metaclass元类的创建与使用的文章就讲到这里了,如果你想了解更多关于举例讲解Python中metaclass元类的创建与使用的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
1、流程控制语句主要有if、ii...else、elseif(有时也可以写成else if)、switch四种。 PHP中语句格式为: if(条件满足) {执行语句} if(条件满足) {执行
目录 DFS初步概念 DFS例题-迷宫游戏 题目描述 输入输出格式 输入输出样例
This question两年前被问到,但它提到的资源要么不是很有帮助(恕我直言),要么链接不再有效。 必须有一些很好的教程才能理解 Phaser .我已经阅读了 javadoc,但我的眼睛呆滞了,因
This question两年前被问到,但它提到的资源要么不是很有帮助(恕我直言),要么链接不再有效。 必须有一些很好的教程才能理解 Phaser .我已经阅读了 javadoc,但我的眼睛呆滞了,因
参考资料: [2411.14499] Understanding World or Predicting Future? A Comprehensive Survey of World Mod
这个正则出自这个网站 http://www.regexlab.com/zh/regref.htm 正向预搜索:"(?=xxxxx)","(?!xxxxx)"
chr(9)、chr(10)、chr(13)、chr(32)、chr(34) 所有关于 ASCII码的表格:[url]http://www.asciitable.com/[/url] chr(13)
我是一名优秀的程序员,十分优秀!