之前的文章提到,使用type关键字可以用来动态地生成一个类,但是这样写实在是太麻烦了,需要创建一大堆的参数。大部分的动态创建,都可以简单地使用以下方法来实现。
1 |
|
但在一般的实践场景下,上面的代码都应该被尽量的避免,因为就单单地创建对象而言,不如直接定义两个类方便。(但也有意外,例如上层程序希望传递不同的值而获得相同类但不同的属性时)
更多的情况下,我们希望类实例创建时准守某个准则,比如对类的属性做检查,并自动将驼峰、大写命名的属性全部转换为小写。先来看看一般地做法是怎样的吧:
1 |
|
通过上述方法,我们悄悄地将类变量
1 |
|
但是,有没有更加简单的方案呢?
Python世界里的ORM映射
如果你使用Python做过Web应用开发,你应该对ORM比较熟悉,它将一个Model映射到数据库中的表中,并且封装了大量的SQL语句。有经验的你一定发现了,在一个Model中定义的属性,居然和最后取出来的不一样。例如:
1 | # Python3 flask-sqlalchemy |
SQLAlchemy中的这种实现,就得益于
再回到我们之前的问题,利用
1 | # Python3 |
值得注意的是,这里继承的metaclass应该真的是一个类,而这里使用了一个type来模拟它。(可以看出Python中对象之间的转换是多么灵活……)
1 | # Python3 |
未完待续……