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 元类的主要内容,如果未能解决你的问题,请参考以下文章