Python 面向对象特殊成员以及嵌套

Python 面向对象嵌套

对象中的特殊成员(部分)
  1. 真正的构造方法,先创建一个空对象并返回, new(cls,)
  2. 类名() ,对象内部数据初始化,自动执行__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
  1. 对象名[ 参数 ], 自动执行__getitem__(self,*args)
class New(object):
    def __getitem__(self,*args):#这里必须传入一个接受数据的形参
        print('Hello')
demo1=New()
demo1['参数']#[ ]中必须有参数才不会报错
  1. 对象名[ 参数 ]=参数 自动执行__setitem__(self,), 无返回值
class New(object):
    def __setitem__(self,*args):#这里必须传入一个接受数据的形参
        print(args)
demo1=New()
demo1['参数']=1#执行__setitem__, 输出('参数', 1)
  1. del 对象名[ 参数 ] , 自动执行__delitem__(self,), 无返回值
class New(object):
    def __delitem__(self,*args):#这里必须传入一个接受数据的形参
        print(args)
demo1=New()
del demo1['参数']#执行__delitem__, 输出并打印('参数',)
  1. 对象+对象 ,自动执行__add__(self,)
class New(object):
    def __add__(self,other):
    #这里必须传入一个接受数据的形参可以任意名,用于接收第二个对象的数据
        return ('Q')
demo1=New()
demo2=New()
print(demo1+demo2)#执行__add__,输出打印Q
  1. 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
对象之间嵌套
  1. 嵌套其实就是另一种的相同方法或者字段的分类封装
  2. 类和类实例化后的对象可以做字典的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()

执行结果:
在这里插入图片描述

发布了66 篇原创文章 · 获赞 7 · 访问量 2368

猜你喜欢

转载自blog.csdn.net/qq_45894553/article/details/105134028