面向对象高级B
Posted michealjy
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了面向对象高级B相关的知识,希望对你有一定的参考价值。
元类
python一切皆对象,类实际上也是一个一个对象
类是一个对象,那他一定是由一个类实例化得到,这个类就叫元类
如何找元类
class Person:
def __init__(self, name):
self.name = name
def score(self):
print('分数是100')
print(type(Person))
#<class 'type'>
#所有类的元类都是type
常规的class 类名 会把类构造出来,实际上是元类实例化产生类这个对象,
**Person类是对象,一定是由一个类实例化产生的,所以type()产生对象,调用__init__方法,看源码里面需要穿三个参数**
class底层实现原理是: type(object_or_name, bases, dict),
object_or_name: 类的名字,是个字符串
bases: 是它的所有父类,基类
dict: 名称空间是一个字典
#通过type来直接产生类,不用class关键字
l =
exec'''
school='oldboy'
def __init__(self, name):
self.name = name
def score(self):
print('分数是100')
''', , l
def __init__(self, name):
self.name=name
Person = type('Person', (object,), l) # 等同于生成一个Person类,其中具有school属性,对象有name属性,有score方法
### 下面几句可以生成一个Person类,与上面的语句实现相同的功能
#def __init__(self, name):
#self.name = name
#Person = type('Person', (object,), 'school':'
# oldboy','__init__':__init__)
自定义元类
来控制类的产生,可以控制类名,可以控制类的继承关系 ,控制类的名称空间
自定义元类必须继承type,写一个类继承type,这种类都叫元类
class Mymeta(type):
def __init__(self, name, bases,dic):
#练习一:加限制 控制类名必须以sb 开头
if not name.startswith('sb'):
raise Exception(’类名没有以sb开头‘)# 如果不是以sb开头,就会抛异常
#练习二:类必须加注释
print(self.__dict__['__doc__']) # 有注释的话会把注释打印出来
#metaclass=Mymeta 指定这个类生成的时候,用自己写的Mymeta这个元类
class Person(object,metaclass=Mymeta):
'''
注释
'''
school = 'oldboy'
def __init__(self, name):
self.name = name
def score(self):
print('分数是100')
p = Person('nick')
- 自定义一个元类,控制类产生,类的名称空间必须有name字段才能创建成功,否则失败
class Mymeta(type):
def __init__(self, x, y, z):
for k, v in self.__dict__.items():
print(k,v)
# print(self.__dict__)
if 'name' not in self.__dict__.values() and 'name'not in self.__dict__.keys():
raise Exception('你的类没有“name”这个字段')
else:
print('名称空间已经存在"name"')
- 自定义一个元类,定义一个类,继承字典,使其具备 点取值和赋值功能,通过元类控制对象的产生,把所有对象的属性都放在attr字典中,属性全部删除
例如di=Mydict(name=‘lqz‘, age=18) di的名称空间中没有name和age属性,但是有attr字典属性,字典包含‘name‘:‘lqz‘, ‘age‘:18
class Mymeta(type):
def __init__(self, *args, **kwargs):
self.attr =
class Mydict(dict, metaclass=Mymeta):
attr =
def __init__(self,**kwargs):
super().__init__(**kwargs)
def __getattr__(self, item):
# print(item)
return self[item]
def __setattr__(self, key, value):
if value not in self.attr:
self.attr[key] = value
print(self.attr)
以上是关于面向对象高级B的主要内容,如果未能解决你的问题,请参考以下文章