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'

原文地址:https://www.cnblogs.com/sklhtml/p/9454342.html