元类
这里有一个朋友的博客值得参考学习(在此多谢):
https://www.cnblogs.com/tkqasn/p/6524879.html
本来想写自己的探索的东西,不过在这位朋友这里看完,我探索的他这个都有,所以就直接看这位朋友的博客。
- 这是我的一部分探索代码
def method():
"""
这里添加的方法,没有传入self,不能通过实例对象调用,也不能使用实例属性,
可以通过类名直接调用,但是也没有传入cls,所以只能通过类名.属性来获取类属性(十分不推荐)
"""
print("类方法,类对象是:")
def instance_method(self):
"""传入之后是,普通方法"""
print("实例方法", self)
@staticmethod
def sta_method():
"""传入之后是静态方法"""
print("静态方法")
@classmethod
def cls_method(cls):
"""传入之后是类方法"""
print("类方法", cls)
def meta_cls(cls_name, sup_names, attribute):
print("类名", cls_name)
print("超类:", sup_names[0])
print("修改前参数列表:")
print(attribute)
# 这里可以查看、修改、删除,添加类属性和方法
attribute["name"] = "朝阳产业"
del attribute['c']
attribute["method"] = method
attribute['cls_method'] = cls_method # 添加类方法
attribute['instance_method'] = instance_method # 添加实例方法
attribute['sta_method'] = sta_method # 添加静态方法
print("修改后参数列表:")
print(attribute)
return type(cls_name, sup_names, attribute)
class A(object, metaclass=meta_cls):
c = "cc" # 这里是类属性,属于元类直接管辖范围,元类属性集合中可以接收到并做处理
d = "ddd"
def __init__(self):
self.__aa = 'aa'
self.b = "bbb" # 对象属性属于对象,元类是创建类的,元类函数无法接收实例属性
def get_aa(self):
return self.__aa
a = A()
print("-"*40)
print(a.get_aa())
print(A.name) # 这里证明了,元类中添加的属性是类属性
print("-"*40)
A.cls_method() # 这里可以调用,
# a.cls_method() # 这里不能调用,实例对象调用的时候会自动传入self
a.instance_method()
A.sta_method()
print("-"*40)
print(help(A)) # 粗略打印A类的结构
- 元类实现简单ORM之创建数据库
from pymysql import *
# 第一种元类创建,函数版
# def meta_class(cls_name, sup_names, attributes):
# table_name = cls_name.lower()
# fields = dict()
# for key, value in attributes.items():
# if isinstance(value, tuple):
# fields[key] = value[0]
#
# attributes["table_name"] = table_name
# attributes["fields"] = fields
#
# return type(cls_name, sup_names, attributes)
# 第二种元类创建,继承自type的子类版
class MetaClass(type): # 这里的继承一定注意
def __new__(cls, cls_name, sup_names, attributes):
table_name = cls_name.lower()
fields = dict()
for key, value in attributes.items():
if isinstance(value, tuple):
fields[key] = value[0]
attributes["table_name"] = table_name
attributes["fields"] = fields
# return type(cls_name, sup_names, attributes # 这里第一种传值给type父类
return type.__new__(cls, cls_name, sup_names, attributes) # 第二种
class Table(object):
def create(self):
"""创建表练习"""
conn = connect(
host='localhost',
port=3306,
user='root',
password='......',
database='python',
charset='utf8')
cs = conn.cursor()
sql0 = """drop table if EXISTS %s;""" % self.table_name
field = list()
for temp in self.fields.items():
field.append(" %s %s" % temp) # 自动拆包
field = ",".join(field) # 最后拼接
sql1 = """create TABLE %s (%s) charset='UTF8' engine = 'innodb';""" % (self.table_name, field)
cs.execute(sql0)
cs.execute(sql1)
conn.commit()
cs.close()
conn.close()
# ---------------------------以上为框架----------------------------
class Exesices(Table, metaclass=MetaClass): # 或者 metaclass=meta_class
"""创建exesices表"""
id = ("int unsigned primary key auto_increment",)
name = ("varchar(64) not null",)
t = Exesices()
t.create()