python 元编程

看别人代码时候可以用

introduction

用元类进行编程的方法

元(Meta, 抽象)

面向过程 - 面向函数 - 面向对象

语法 - 语句

类 - 对象

元类 - 类

1
2
3
4
5
6
7
8
type(name, bases, attrs)
Name : 类名字符串
bases: 父类元组
Attrs: 属性字典

example:
A = type('A', (object,), {'b': 1})
a = A()

拿type做父类

1
2
3
4
5
6
7
8
9
10
11
12
13
class Sip(type):
def __init__(cls, name, bases, nmspc):
super(Sip, cls).__init__(name,bases,nmspc)
cls.uses_metaclass = lambda self: "Yes!"

A = Sip('A', (), {})
'''
==
'''


class A(object):
__metaclass__ = Sip
# class A 是通过元类产生的新的类

元类定义的都是类的方法,(父类主要定义类的行为)

第一个参数不是self,而是cls

不可继承的类

1
2
3
4
5
class final(type):
def __init__(cls,name,bases,namespaces):
super(final, cls).__init__(name, bases, atts)
for klass in bases:
assert not isinstance(klass, final)

__metaclass__ = type

__new__

  1. 对于直接分配空间类的继承,比如int, str, tuple得用new代替init
  2. 单例模式 hasattr(cls,’instance’)

抽象方法

不一定需要实例化抽象方法

1
2
3
class father(object):
def Mymethod(self):
raise NotImplementedError('... not realize')

接口

再继承MyAbstractClass1之后需要实例化抽象方法

1
2
3
4
5
from abc import ABCMeta, abstractmethod
class MyAbstractClass1(object):
__metaclass__ = ABCMeta
@abstractmethod
def method1(self): pass

ORM

object relational mapping

把数据库操作用面向对象的方法来实现

1
2
3
4
class User(Model):
id = IntergerField('uid')
name = StringField('username')
email = StringField('email')
文章目录
  1. 1. introduction
  2. 2. 元类 - 类
    1. 2.1. 拿type做父类
    2. 2.2. 不可继承的类
    3. 2.3. __new__
    4. 2.4. 抽象方法
      1. 2.4.1. 接口
  3. 3. ORM