对组和的补充和主动调用其他类的成员以及特殊成员

一.关于上篇博客的总结:

1.成员(类):

  (3).变量:

    类变量(静态字段) 格式:类.字段/对象.字段

    示例变量(字段)  格式:对象.字段

  (2).方法:

    实例方法  格式:对象.方法名

    静态方法  格式:类.方法名/对象.方法名

    类方法   格式:类.方法名/对象.方法名

  (1).属性:

    普通属性  格式:对象.属性名

 2.修饰符:

公/私

3.组和(嵌套)

class Venue:
    def __init__(self, address):
        self.address = address


bj = Venue('北京鸟巢')
sh = Venue('上海体育馆 ')
sz = Venue('深圳体育馆')


class Schedule(object):
    def __init__(self, name, period, price, venue=None):
        self.name = name
        self.period = period
        self.price = price
        self.venue = venue


bs1 = Schedule('LPL季前赛', 7, 100, bj)
ss2 = Schedule('LPL季中赛', 7, 200, sh)
zs3 = Schedule('LPL总决赛', 7, 400, sz)

bs4 = Schedule('LPL总决赛', 7, 400, bj)
ss5 = Schedule('LPL季后赛', 7, 300, sh)

bs6 = Schedule('LPL表演赛', 7, 250, bj)


class Battle(object):
    def __init__(self,name,start_time,end_time,people,introduction,schedule = None):
        self.name = name
        self.start_time = start_time
        self.end_time = end_time
        self.people = people
        self.introduction = introduction
        self.schedule = schedule

br1 = Battle('RNG VS IG','2018','2019',70,'鼓掌',bs1)
br2 = Battle('OMG VS RNG','2018','2019',70,'鼓掌',bs1)
br3 = Battle('OMG VS SKT','2018','2019',70,'鼓掌',ss2)
br4 = Battle('RNG VS SKT','2018','2019',70,'鼓掌',bs6)

print(br1.schedule.venue.address)
嵌套练习:

二.组和的补充

1.类或对象能否做字典的key

class Foo:
    pass

user_info = {
    Foo:1,
    Foo():5
}

print(user_info)

2.确保对象中到底有什么

class Foo(object):

    def __init__(self,age):
        self.age = age

    def display(self):
        print(self.age)

data_list = [Foo(8),Foo(9)]
for item in data_list:
    print(item.age,item.display())

结果:
8
8 None
9
9 None
对象中有什么?

3.习题开始了:

class StarkConfig(object):

    def __init__(self,num):
        self.num = num

    def changelist(self,request):
        print(self.num,request)

class RoleConfig(StarkConfig):

    def changelist(self,request):
        print('666')

# 创建了一个列表,列表中有三个对象(实例)
# [ StarkConfig对象(num=1), StarkConfig对象(num=2), RoleConfig对象(num=3) ]
config_obj_list = [StarkConfig(1),StarkConfig(2),RoleConfig(3)]
for item in config_obj_list:
    print(item.num)

结果:
1
2
3
开始

4.一大波习题即将到来:

class StarkConfig(object):

    def __init__(self,num):
        self.num = num

    def changelist(self,request):
        print(self.num,request)

class RoleConfig(StarkConfig):
    pass

# 创建了一个列表,列表中有三个对象(实例)
# [ StarkConfig对象(num=1), StarkConfig对象(num=2), RoleConfig对象(num=3) ]
config_obj_list = [StarkConfig(1),StarkConfig(2),RoleConfig(3)]
for item in config_obj_list:
    item.changelist(168)

结果:
1 168
2 168
3 168
坚持住

5.来了,它们来了

class StarkConfig(object):

    def __init__(self,num):
        self.num = num

    def changelist(self,request):
        print(self.num,request)

class RoleConfig(StarkConfig):

    def changelist(self,request):
        print(666,self.num)

# 创建了一个列表,列表中有三个对象(实例)
# [ StarkConfig对象(num=1), StarkConfig对象(num=2), RoleConfig对象(num=3) ]
config_obj_list = [StarkConfig(1),StarkConfig(2),RoleConfig(3)]
for item in config_obj_list:
    item.changelist(168)

结果:
1 168
2 168
666 3
加油,不要放弃抵抗

6.坚持到了现在,不错嘛

class StarkConfig(object):

    def __init__(self,num):
        self.num = num

    def changelist(self,request):
        print(self.num,request)

    def run(self):
        self.changelist(999)

class RoleConfig(StarkConfig):

    def changelist(self,request):
        print(666,self.num)

config_obj_list = [StarkConfig(1),StarkConfig(2),RoleConfig(3)]
config_obj_list[1].run()
config_obj_list[2].run()

结果:
2 999
666 3
再坚持会,马上结束了

7.马上就要结束了

class StarkConfig(object):

    def __init__(self,num):
        self.num = num

    def changelist(self,request):
        print(self.num,request)

    def run(self):
        self.changelist(999)

class RoleConfig(StarkConfig):

    def changelist(self,request):
        print(666,self.num)


class AdminSite(object):
    def __init__(self):
        self._registry = {}

    def register(self,k,v):
        self._registry[k] = v

site = AdminSite()
print(len(site._registry)) # 0
site.register('range',666)
site.register('shilei',438)
print(len(site._registry)) # 2

site.register('lyd',StarkConfig(19))
site.register('yjl',StarkConfig(20))
site.register('fgz',RoleConfig(33))

print(len(site._registry)) # 5

结果:
0
2
5
相信我,马上结束

8.真的要结束了

class StarkConfig(object):

    def __init__(self,num):
        self.num = num

    def changelist(self,request):
        print(self.num,request)

    def run(self):
        self.changelist(999)

class RoleConfig(StarkConfig):

    def changelist(self,request):
        print(666,self.num)

class AdminSite(object):
    def __init__(self):
        self._registry = {}

    def register(self,k,v):
        self._registry[k] = v

site = AdminSite()
site.register('lyd',StarkConfig(19))
site.register('yjl',StarkConfig(20))
site.register('fgz',RoleConfig(33))
print(len(site._registry)) # 3

for k,row in site._registry.items():
    row.changelist(5)

结果:
3
19 5
20 5
666 33
结束了

9.我说的是真的

class StarkConfig(object):

    def __init__(self,num):
        self.num = num

    def changelist(self,request):
        print(self.num,request)

    def run(self):
        self.changelist(999)

class RoleConfig(StarkConfig):

    def changelist(self,request):
        print(666,self.num)

class AdminSite(object):
    def __init__(self):
        self._registry = {}

    def register(self,k,v):
        self._registry[k] = v

site = AdminSite()
site.register('lyd',StarkConfig(19))
site.register('yjl',StarkConfig(20))
site.register('fgz',RoleConfig(33))
print(len(site._registry)) # 3

for k,row in site._registry.items():
    row.run()

结果:
3
19 999
20 999
666 33
这次是真的要结束了

10.没想到吧,还有一个

class UserInfo(object):
    pass

class Department(object):
    pass

class StarkConfig(object):

    def __init__(self,num):
        self.num = num

    def changelist(self,request):
        print(self.num,request)

    def run(self):
        self.changelist(999)

class RoleConfig(StarkConfig):

    def changelist(self,request):
        print(666,self.num)

class AdminSite(object):
    def __init__(self):
        self._registry = {}

    def register(self,k,v):
        self._registry[k] = v(k)

site = AdminSite()
site.register(UserInfo,StarkConfig)
site.register(Department,StarkConfig)
print(len(site._registry)) # 3
for k,row in site._registry.items():
    row.run()

结果:
2
UserInfo 999
Department 999
最后了,重要的,压轴的

11.总结一波:

  一定要确定对象中封装了什么

  一定要确定self到底是哪个sb

三.主动调用其他类的成员

# 方式一
class Base(object):

    def f1(self):
        print('5个功能')

class Foo(object):

    def f1(self):
        print('3个功能')
        Base.f1(self)

obj = Foo()
obj.f1()
方式一
# 方式二:按照类的继承顺序,找下一个.

class Base(object):
    def f1(self):
        print('5个功能')

class Foo(Base):
    def f1(self):
        super().f1()
        print('3个功能')
        
obj = Foo()
obj.f1()


# 方式二:按照类的继承顺序,找下一个.
class Foo(object):
    def f1(self):
        super().f1()
        print('3个功能')

class Bar(object):
    def f1(self):
        print('6个功能')

class Info(Foo,Bar):
    pass

# obj = Foo()    # 报错,因为super无法找到Foo继承了谁
# obj.f1()

obj = Info()
obj.f1()
方式二

四.特殊成员:

1.__init__

构造方法,通过类创建时,自动触发执行.

# __init__
class Foo:
    def __init__(self,a1,a2):
        self.a1 = a1
        self.a2 = a2

obj = Foo(1,2)
__init__

2.__call__

对象后面加括号,触发执行

注:构造方法的执行是由创建对象触发的,即:对象 = 类名();而对于__call__方法的执行

是由对象后加括号触发的,即:对象()或者类()()

# __call__
class Foo:
    def __call__(self, *args, **kwargs):
        print(1,2,3,args,kwargs)
        return 123
obj = Foo()
ret = obj(0,9,8,a1 = 76)
print(ret)

Foo()(0,9,8,a1 = 76)    # 不常用

结果:
1 2 3 (0, 9, 8) {'a1': 76}
123
1 2 3 (0, 9, 8) {'a1': 76}
__call__

3.__getitem__,__setitem__,__delitem__

用于索引操作,如字典;以上分别表示获取,设置,删除数据

# __getitem__
class Foo:
    def __getitem__(self, item):
        print(item)
        return "哈哈"
obj = Foo()
ret = obj['嘿嘿']
print(ret)

结果:
嘿嘿
哈哈
__getitem__
# __setitem__
class Foo:
    def __setitem__(self, key, value):
        print(key,value,1111)
obj = Foo()
obj['k1'] = 123

结果:
k1 123 1111
__setitem__
# __delitem__
class Foo:
    def __delitem__(self, key):
        print(key)
obj = Foo()
del obj['hhh']

结果:
hhh
__delitem__

4.__add__

 对象+对象

# __add__
class Foo:
    def __init__(self,a1,a2):
        self.a1 = a1
        self.a2 = a2

    def __add__(self, other):
        return self.a1 + other.a1

obj = Foo(1,1)
obj2 = Foo(99,88)
ret = obj2 + obj
print(ret)

结果:
100
__add__

 5.with对象

自动执行__enter__/__exit__

# with对象    自动执行__enter__/__exit__
class Foo:
    def __init__(self,a1,a2):
        self.a1 = a1
        self.a2 = a2

    def __enter__(self):
        print('111')
        return 999

    def __exit__(self, exc_type, exc_val, exc_tb):
        print('222')

obj = Foo(1,2)
with obj as f:
    print(f)
    print('内部代码')

结果:
111
999
内部代码
222
with

 6.来个组和拳

class Foo(object):

    def __init__(self,a1,a2):
        self.a1 = a1
        self.a2 = a2
    
    def __call__(self, *args, **kwargs):
        print(11111,args,kwargs)
        return 123

    def __getitem__(self, item):
        print(item)
        return 8

    def __setitem__(self, key, value):
        print(key,value,111111111)

    def __delitem__(self, key):
        print(key)

    def __add__(self, other):
        return self.a1 + other.a2

    def __enter__(self):
        print('1111')
        return 999

    def __exit__(self, exc_type, exc_val, exc_tb):
        print('22222')

# 1. 类名() 自动执行 __init__
obj = Foo(1,2)

# 2. 对象() 自动执行 __call__
ret = obj(6,4,2,k1=456)

# 3. 对象['xx']  自动执行 __getitem__
ret = obj['yu']
print(ret)

# 4. 对象['xx'] = 11  自动执行 __setitem__
obj['k1'] = 123

# 5. del 对象[xx]     自动执行 __delitem__
del obj['uuu']

# 6. 对象+对象         自动执行 __add__
obj1 = Foo(1,2)
obj2 = Foo(88,99)
ret = obj2 + obj1
print(ret)

# 7. with 对象        自动执行 __enter__ / __exit__
obj = Foo(1,2)
with obj as f:
    print(f)
    print('内部代码')

结果:
11111 (6, 4, 2) {'k1': 456}
yu
8
k1 123 111111111
uuu
90
1111
999
内部代码
22222
摞在一起

7.真正的构造方法:__new__

class Foo(object):
    def __init__(self, a1, a2):     # 初始化方法
        """
        为空对象进行数据初始化
        :param a1:
        :param a2:
        """
        self.a1 = a1
        self.a2 = a2

    def __new__(cls, *args, **kwargs): # 构造方法
        """
        创建一个空对象
        :param args:
        :param kwargs:
        :return:
        """
        return object.__new__(cls) # Python内部创建一个当前类的对象(初创时内部是空的.).

obj1 = Foo(1,2)
print(obj1)

obj2 = Foo(11,12)
print(obj2)
真正的构造方法__new__
posted @ 2018-08-29 15:37  骑驴老神仙  阅读(181)  评论(0)    收藏  举报