zoukankan      html  css  js  c++  java
  • python 元类

    # 类也是对象
    # 一切皆对象

    class Person(object):

    num = 0

    print("--person--test--")

    def __init__(self):
      self.name = 'abc'

    # --person--test--
    print(100)
    # 100
    print("hello")
    # hello
    print("tt")
    # tt
    print(Person)
    # <class '__main__.Person'>

    # 动态创建类
    def choose_class(name):
      if name == 'foo':
        class Foo(object):
          pass
        return Foo #返回的是类,不是类的实例
      else:
        class Bar(object):
          pass
        return Bar

    myClass = choose_class('foo')
    print(myClass) #函数返回的是类,不是类的实例
    # <class '__main__.choose_class.<locals>.Foo'>


    print(myClass()) #你可以通过这个类创建类实例,也就是对象
    # <__main__.choose_class.<locals>.Foo object at 0x000001EEDC675DA0>

    # 使用type创建对象
    print(type(100)) #int
    print(type("12345")) #str

    class Person:
      pass

    p1 = Person()
    print(type(p1)) #<class '__main__.Person'>

    class Test:
    pass

    t1 = Test()
    # 使用type创建类

    # type()
    # type可以接受一个类的描述座位参数,然后返回一个类
    # type(类名,由父类名称组成的元组(针对继承的情况,可以为空),包含属性的字典(名称和值))


    Test2 = type("Test2",(),{})
    print(Test2) # <class '__main__.Test2'>

    # 类是用type创建的
    # 实例对象是class创建的,class是由type创建的


    def printNum(self):
      print("--num--%d"%self.num)

    Test3 = type("Test3",(),{"printNum":printNum})

    t1 = Test3()
    t1.num = 100
    t1.printNum() #--num--100

    class Animal:
      def eat(self):
        print('----eat-----')

    class Dog(Animal):
    pass

    wangcai = Dog()
    wangcai.eat() #----eat-----


    Cat = type("Cat",(Animal,),{})

    xiaohuamao = Cat()
    xiaohuamao.eat() #----eat-----

    print(Cat.__class__)
    # <class 'type'>


    # 到底什么是元类了?
    # 元类就是用来创建这些类(对象),元类就是类的类
    # myClass = MetaClass() #使用元类创建处一个对象,这个对象成为类
    # MyObject = myClass() #使用"类"来创建出实例对象


    # __metaclass__属性(python2中)
    # 你可以再定义一个类的时候为其添加__metaclass__属性
    class Too(object):
    __metaclass__ = something


    # 自定义元类
    def upper_attr(future_class_name,future_class_parents,future_class_attr):
    newAttr = {}
    for name,vlaue in future_class_attr.items():
    if not name.startswitch("__"): #以什么什么开头
    newAttr[name.upprt()] = value

    return type(future_class_name,future_class_parents,newAttr)


    class Too(object):
    __metaclass__ = upper_attr #设置Foo类的元类为uppper_attr
    bar = 'bip'


    print(hasattr(Foo,'bar'))
    print(hasattr(Foo,'BAR'))


    t = Foo
    print(t.BAR)
    print(t.bar)


    # python3中
    def upper_attr(future_class_name,future_class_parents,future_class_attr):
    newAttr = {}
    for name,vlaue in future_class_attr.items():
    if not name.startswitch("__"): #以什么什么开头
    newAttr[name.upprt()] = value

    return type(future_class_name,future_class_parents,newAttr)


    class Too(object,metaclass):
    __metaclass__ = upper_attr #设置Foo类的元类为uppper_attr
    bar = 'bip'

  • 相关阅读:
    Python ---chart
    python ---Pandas时间序列:生成指定范围的日期
    python 生成图表
    top 学习
    linux awk命令详解
    /proc 目录详细说明
    ps 和 top 的cpu的区别
    linux 监控性能学习笔记(1)
    转如何用九条命令在一分钟内检查Linux服务器性能?
    Linux系统排查——CPU负载篇
  • 原文地址:https://www.cnblogs.com/sklhtml/p/9454342.html
Copyright © 2011-2022 走看看