python--元类

元类

这里有一个朋友的博客值得参考学习(在此多谢):

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()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值