Python 面向对象嵌套
对象中的特殊成员(部分)
- 真正的构造方法,先创建一个空对象并返回, new(cls,)
- 类名() ,对象内部数据初始化,自动执行__init__(self,)
class Old:
pass
class New(Old):
#构造一个新的空对象,用于之后的数据封装
def __new__(cls,*args,**kwargs):#这里必须有接受数据的形参,否则报错
print(2)
return Old.__new__(cls) #如果无返回值,则只会执行到这一步
# 以其他类的__new__(cls)方法在Python内部创建一个空的对象并返回
def __init__(self,name,age):#主要用于数据初始化
print(1)
self.name=name
self.age=age
demo1=New('小明',10)
print(demo1.name)
print(demo1.age)
运行效果图:
3. 对象名(), 自动执行__call__(self,)
class New(object):
def __call__(self):#主要用于数据初始化
print('Hello')
demo1=New()
demo1()#执行__call__, 输出打印Hello
- 对象名[ 参数 ], 自动执行__getitem__(self,*args)
class New(object):
def __getitem__(self,*args):#这里必须传入一个接受数据的形参
print('Hello')
demo1=New()
demo1['参数']#[ ]中必须有参数才不会报错
- 对象名[ 参数 ]=参数 自动执行__setitem__(self,), 无返回值
class New(object):
def __setitem__(self,*args):#这里必须传入一个接受数据的形参
print(args)
demo1=New()
demo1['参数']=1#执行__setitem__, 输出('参数', 1)
- del 对象名[ 参数 ] , 自动执行__delitem__(self,), 无返回值
class New(object):
def __delitem__(self,*args):#这里必须传入一个接受数据的形参
print(args)
demo1=New()
del demo1['参数']#执行__delitem__, 输出并打印('参数',)
- 对象+对象 ,自动执行__add__(self,)
class New(object):
def __add__(self,other):
#这里必须传入一个接受数据的形参可以任意名,用于接收第二个对象的数据
return ('Q')
demo1=New()
demo2=New()
print(demo1+demo2)#执行__add__,输出打印Q
- with 对象 , 自动执行__enter__(self,) ,和__exit__(self,)
class New(object):
def __enter__(self):
print(1)
return ('A')#这里可以有返回值,也可没有
def __exit__(self,exc_type,exc_val,exc_tb):
#这里必须传入三个接受数据的形参也可以任意名
return ('B')
demo1=New()
with demo1:#只执行不接受任何参数
pass
#这里输出打印1
with demo1 as F:#默认接受__enter__返回的参数
print(F)
#这里输出打印1,A
对象之间嵌套
- 嵌套其实就是另一种的相同方法或者字段的分类封装
- 类和类实例化后的对象可以做字典的key
# 应用场景:存在多类不同类型的方法或者字段需要分类封装时
class School:
def __init__(self,name,address):
self.name=name
self.address=address
def work(self):
print('在%s中工作'%(self.name))
class Teacher:
def __init__(self,name,age,gender):
self.name=name
self.age=age
self.gender=gender
self.school=None #暂时无学校
#实力化两个学校
School1=School('QingHua','BeiJing')
School2=School('BeiDa','BeiJing')
#实例化三个老师
teacher1=Teacher('小明',21,'男')
teacher2=Teacher('小华',22,'男')
teacher3=Teacher('小红',18,'女')
#给三个老师分配学校
teacher1.school=School1
teacher2.school=School1
teacher3.school=School2
#输出老师的信息
lst=[teacher1,teacher2,teacher3]
for ele in lst:
print(ele.name)
print(ele.age)
print(ele.gender)
print(ele.school.name)
print(ele.school.address,'\n')
主动调用其他类的成员
class New(object):
def __init__(self,name,age):
self.name=name
self.age=age
def show1(self):
print(self.name)
print(self.age)
def show2():
print('name')
print('age')
class Old(object):
def __init__(self,name,age):
self.name=name
self.age=age
def show3(self):
New.show1(self)#其他类的实例方法应该传入self才能使用即:类名.实例方法(self)
New.show2()#其他方法,类名.方法()调用即可
demo1=Old('小明',12)
demo2=New('小红',10)
demo1.show3()
执行结果: