• python全栈开发_day28_元类(上)


    eval与exec内置方法

    # 将字符串作为执行目标,得到响应结果

    # eval常用作类型转换:该函数执行完有返回值
    dic_str = "{'a':1, 'b':2, 'c':3}"
    dic = eval(dic)

    # exec拥有执行更复杂的字符串:可以形成名称空间
    class_str = = '''
    a = 10
    b = 20
    @classmethod
    def fn(cls):
      pass
    '''
    local_dic = {}
    # 可以操作全局与局部两个名称空间,一般不用关心全局名称空间
    exec(class_str, {}, local_dic)

     

    元类

    # 元类:类的类
    # 通过class产生的类,也是对象,而元类就是用来产生该对象的类
    local_str = """
    def __init__(self, name, age):
      self.name = name
      self.age = age
    def study(self):
      print(self.name + '在学习')
    """
    local_dic = {}
    exec(local_str, {}, local_dic)
    Student = type('Student', (), l_d)
    print(Student)

     

    自定义元类

    # 控制类的产生过程,以及该类对象的产生过程
    class MyMeta(type):
       # 控制类的创建过程
       def __init__(cls, class_name, bases, namespace):
           print(cls, class_name, bases, namespace)
           super().__init__(class_name, bases, namespace)

       def __call__(cls, *args, **kwargs):
           obj = object.__new__(cls)
           cls.__init__(obj, *args, **kwargs)
           return obj

    # Student类与Student类的对象产生都可以备元类MyMeta控制
    class Student(metaclass=MyMeta):
       def __init__(self, name, age):
           self.name = name
           self.age = age
    stu = Student('owen', 18)
    print(stu.name)

     

    元类的应用

    class MyMeta(type):
       def __call__(cls, *args, **kwargs):
           if not hasattr(cls, 'instance'):
               cls.instance = cls.__new__(cls)
               cls.instance.__init__(*args, **kwargs)
           return cls.instance


    class A(metaclass=MyMeta):
       def __init__(self):
           self.ip = '1.1.1.0'

     

  • 相关阅读:
    LINQ学习笔记 Join 与 Group join
    JAVA如何解压缩ZIP文档
    Thread.getContextClassLoader() is null
    如何部署 sources and javadoc jars
    Maven部署异常:on project standalone-pom: Cannot deploy artifact from the local repository解决方法
    Git忽略规则及.gitignore规则不生效的解决办法
    Java算法HmacSHA256不可用
    DHCP协议
    【Redis】Redis实现计数器
    【前端】JavaScript原型链与继承
  • 原文地址:https://www.cnblogs.com/xuxingping/p/10853774.html
Copyright © 2020-2023  润新知