python中的元类

请参考博文深刻理解Python中的元类(metaclass)

1
2
a = 10
print(a.__class__)

这里,10是一个对象,通过a.__class__就可以找到创建该对象的类,结果是<class 'int'>

同理

1
2
s = "abc"
print(s.__class__)

结果为<class 'str'>

自定义类

1
2
3
4
5
6
7
class Person:
pass


p = Person()

print(p.__class__)

结果为<class '__main__.Person'>

那么,根据“类也是对象”这句话,int这个类对象,是谁来创建的呢?

1
print(int.__class__) # 或者print(a.__class__.__class__)

结果为<class 'type'>

同理

1
2
3
4
5
6
7
class Person:
pass


p = Person()

print(Person.__class__) # 或者print(p.__class__.__class__)

它们的关系,可以用下图表示

对象是由类创建出来的,而类也是个对象,所以类对象是由另外的类创建出来的。这个类,称为元类。

type是Python的一个内建元类,用来直接控制生成类,在python当中任何class定义的类其实都是type类实例化的结果

“Python中的类也是对象”。请深刻理解这句话。

自定义元类

  1. 最简单的情况

    定义一个类,除了用class关键字外,还可以用type

    1
    2
    class Person(object):
    pass
    1
    Person = type('Person', (object, ), {})

    这两种方式是等价的

  2. 有属性和方法的情况

    1
    2
    3
    4
    5
    6
    7
    8
    class Person(object):
    foo = True

    def __init__(self):
    self.age = 20

    def greet(self):
    print('hello world')
    1
    2
    3
    4
    5
    6
    7
    8
    9
    def __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
2
import datetime
print(datetime.datetime.now())

这个import是引入整个datetime包,而

1
2
from datetime import datetime
print(datetime.now())

是只引入datetime包里的datetime