python中的元类
请参考博文深刻理解Python中的元类(metaclass)
1 | a = 10 |
这里,10
是一个对象,通过a.__class__
就可以找到创建该对象的类,结果是<class 'int'>
同理
1 | s = "abc" |
结果为<class 'str'>
自定义类
1 | class Person: |
结果为<class '__main__.Person'>
那么,根据“类也是对象”这句话,int
这个类对象,是谁来创建的呢?
1 | print(int.__class__) # 或者print(a.__class__.__class__) |
结果为<class 'type'>
同理
1 | class Person: |
它们的关系,可以用下图表示
对象是由类创建出来的,而类也是个对象,所以类对象是由另外的类创建出来的。这个类,称为元类。
type是Python的一个内建元类,用来直接控制生成类,在python当中任何class定义的类其实都是type类实例化的结果
“Python中的类也是对象”。请深刻理解这句话。
自定义元类
-
最简单的情况
定义一个类,除了用
class
关键字外,还可以用type
1
2class Person(object):
pass1
Person = type('Person', (object, ), {})
这两种方式是等价的
-
有属性和方法的情况
1
2
3
4
5
6
7
8class Person(object):
foo = True
def __init__(self):
self.age = 20
def greet(self):
print('hello world')1
2
3
4
5
6
7
8
9def __init__(self):
self.age = 20
def greet(self):
print('hello world')
Person = type('Person', (object, ), {'foo': True, '__init__': __init__, 'greet': greet})
python中模块__all__
的使用
python模块中的__all__
,用于模块导入时限制,如:from module import *
此时被导入模块若定义了__all__
属性,则只有__all__
内指定的属性、方法、类可被导入;若没定义,则导入模块内的所有公有属性,方法和类。
import和from import的区别
两个import语义有差异
1 | import datetime |
这个import
是引入整个datetime包,而
1 | from datetime import datetime |
是只引入datetime
包里的datetime
类