类也是对象
ps:python中一切皆对象
def:在大多数语言中,类就是一组用来描述如何生成一个对象的代码段
,但是在python中,类同样也是一种对象
。
类是元类的实例
验证
class Test:
print("hello world")
#就此代码段,运行会输出hello world
动态的创建类
def choose_class(name):
if name == "foo":
class Foo:
x = 3
return Foo
else:
class Bar:
pass
return Bar
a = choose_class("foo")
print(a.x)
一般不建议这么写,函数、类属于“一等公民”,不宜定义在其他东西内部,(方法除外,在类里面)
使用type创建类
ps:type有两个功能,但是这只是为了兼容其他版本,这样做是非常不好的,一个函数就应该明确的只有某一个功能
type可以像这样工作:type(类名,由父类名称组成的元组(针对继承的情况,可以为空),包含属性的字典(名称和值))
def func(self):
print(self.num)
Test = type("Test", (), {"num": 0, "func": func}) # 此即元类
t = Test()
t.num = 100
t.func()
可以勉强这么理解:元类:最原始的创建类的东西
type中的继承
class Animal:
def eat(self):
print("---eat---")
class Dog(Animal):
pass
wangcai = Dog()
wangcai.eat()
Cat = type("Cat",(Animal,),{})
hellokitty = Cat()
hellokitty.eat()
metaclass属性
class Foo:
__metaclass__ = something.. #something需要是一个元类,即指定谁创建这个类,如果不写,则先到父类里面找,如果没有,再到内建模块里面找,如果内建模块里还没有,就用python默认的代码进行创建
---省略---
自己定义元类
python3中
def uppper_attr(future_class_name, future_class_parents, future_class_attr):
# 遍历属性字典,把不是__开头的属性名字变为大写
newAttr = {}
for k, v in future_class_attr.items():
if not k.startswith("__"): #把类中所有的普通方法和普通属性的名字大写
newAttr[k.upper()] = v
return type(future_class_name, future_class_parents, newAttr)
class Foo(metaclass=uppper_attr): #meata的谷歌翻译即是“元”的意思
bar = "bip"
print(hasattr(Foo, "bar")) #输出false
print(hasattr(Foo, "BAR")) #输出true
零碎
- hasattr
判断一个类或对象是否有该属性
class T:
x = 100
print(hasattr(T,"x"))
t = T()
print(hasattr(t,"x"))
元类就是深度的魔法,99%的用户应该根本不必为此操心
网友评论