python 元类

Posted 红尘陌上,独自行走

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 元类的主要内容,如果未能解决你的问题,请参考以下文章

Python—元类

python 元类

Python之元类ORM

python 的元类

Python-元类 单例

Python 元类