面向对象之组合的补充,主动调用其他类的成员,特殊成员

一丶组合的补充

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

class Foo:
    pass

user_info = {
    Foo:1,
    Foo():5
}
print(user_info)
#{<class ‘__main__.Foo‘>: 1, <__main__.Foo object at 0x000002CF8B1A9CF8>: 5}

  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())

  解析:为什么最后会带一个None呢?  因为display方法并没有返回值,但是默认返回值是None,所以当调用完display后会默认返回一个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

  解析:列表中存放着的是对象,当用for依次拿出来时调用num,StarkConfig直接把括号里面的传给num,RoleConfig(3)调用时先找自己类里面是否有num,没有就去父类里面找,把括号里的传给父类里面的num,输出num.

  4.示例

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

  解析:跟3有异曲同工之妙,item.changelist(168) 相当于 StarkConfig(1).changelist(168),也就是用对象来调用类中的方法,两个StarkConfig直接把对象中的值传给num,changelist中的值传给request,输出为1,168.而RoleConfig对象在自己类中找不到num,于是去基类(父类)里面找,然后把3赋给num,然后在自己类里找changelist,把168传给request,但是在输出时,输出的是666,跟num,并未输出request,所以最后结果为666,3

  5丶

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)

  解析:先将‘lyd‘,StarkConfig(19) 等这三个加入字典,for循环中把字典中的value赋给row,然后通过row调用changelist,前两个StarkConfig先把对象里的数赋给num,然后再找类中的changelist方法,把5传给request,输出的是num 的值跟request的值,而RoleConfig先在自己类中找num,找不到后去基类(父类)StarkConfig中找,把对象中的数传给num,然后再在自己类中找changelist方法,然后 把5传给request,输出为666,跟基类中的num的值

  6丶

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))
for k,row in site._registry.items():
    row.run()

  解析:向字典中传的key为UserInfo跟Department,value为StarkConfig(UserInfo)和StarkConfig(Department),所以print输出的长度为2,然后再for循环出来value调用,把UserInfo和Department这两个类当做参数传给了num,然后再调用run方法,通过run方法再调用changelist方法,把999传给request,输出的就是UserInfo和Department两个类跟999

  注意;以上几个题要注意调用的是哪个方法,self是哪个类中的.不要转晕了

二丶主动调用其他类的成员

  方式一丶

class Base(object):

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

class Foo(object):

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

obj = Foo()
obj.f1()

  解析:当调用类Foo中的f1方法时,f1方法中也存在着调用类Base中f1的语句,所以调用类Foo中的f1也相当于调用了类Base

  方式二丶按照类的继承顺序,找下一个.

class Foo(object):
    def f1(self):
        super().f1()
        print(‘3个功能‘)

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

class Info(Foo,Bar):
    pass

obj = Info()
obj.f1()

  解析:通过类的继承顺序,依次查找下一个

  三丶特殊成员

  1.__init__  构造方法,通过类创建对象时,自动触发执行。

class Foo:

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

obj = Foo(‘迪迦‘) # 自动执行类中的 __init__ 方法

  2.__call__  对象后面加括号,触发执行。

class Foo:

    def __init__(self):
        pass

    def __call__(self, *args, **kwargs):

        print ‘__call__‘

obj = Foo() # 执行 __init__
obj()       # 执行 __call__

  3.__getitem__  对[XXX"] 自动执行

class Foo(object):
    def __getitem__(self, item):
        print(item)
        return 8

obj = Foo()
ret = obj[‘yu‘]
print(ret)

  4.__setitem__  对象[XXX"] = 11 自动执行

class Foo(object):
    def __setitem__(self, key, value):
        print(key, value, 111111111)
obj = Foo()
obj[‘k1‘] = 123

  5.del 对象[xxx]  自动执行 __delitem__

class Foo(object):
    def __delitem__(self, key):
        print(key)
obj = Foo()
del obj[‘uuu‘]

  6.对象+对象  自动执行 __add__

class Foo(object):
    def __init__(self, a1, a2):
        self.a1 = a1
        self.a2 = a2
    def __add__(self, other):
        return self.a1 + other.a2
obj1 = Foo(1,2)
obj2 = Foo(88,99)
ret = obj2 + obj1
print(ret)

  7.with 对象  自动执行__enter__/__exit__

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

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

    def __exit__(self, exc_type, exc_val, exc_tb):
        print(‘22222‘)
obj = Foo(1,2)
with obj as f:
    print(f)
    print(‘内部代码‘)

  8.真正的构造方法

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)

原文地址:https://www.cnblogs.com/qicun/p/9555093.html

时间: 2024-10-28 04:32:18

面向对象之组合的补充,主动调用其他类的成员,特殊成员的相关文章

主动调用其他类的成员, 特殊成员

一. 主动调用其他类的成员 class Base(object): def f1(self): print('5个功能') obj = Base() Base.f1(obj) obj.f1() 方式一 class Base(object): def f1(self): print('5个功能') class Foo(object): def f1(self): print('3个功能') Base.f1(self) obj = Foo() obj.f1() 方式二:按照类的继承顺序,找下一个.

python自动化_day6_面向对象_组合,继承,多态

复习:http://www.cnblogs.com/Eva-J/articles/7228075.html 模块 1 import collections,os,sys,re,random,time 2 collections.defaultdict() #默认字典 默认字典的优势就是该字典中如果没有元素就直接添加 3 collections.OrderedDict() #有序字典 字典是有序的可以直接用索引调用 4 collections.namedtuple() #可命名元祖 可以把两个元组

Python基础day-18[面向对象:继承,组合,接口归一化]

继承: 在Python3中默认继承object类.但凡是继承了object类以及子类的类称为新式类(Python3中全是这个).没有继承的称为经典类(在Python2中没有继承object以及他的子类都是经典类.) 继承是类与类的关系,解决了代码重用的问题,减少冗余代码.在Python中是先定义父类,然后在定义子类.最后使用 子类来实例化对象. "继承是一种什么是什么的关系.例如:下面的s1是obj的子类." #父类的定义:class obj: #定义一个obj类 pass class

面向对象编程案例02--显示地调用父类的__init__()

# -*- coding: utf-8 -*- #python 27 #xiaodeng #面向对象编程案例02--显示地调用父类的__init__() ''' 继承是面向对象的重要特征之一,继承是2个类或多个类之间的父子关系,子类继承父类的所有共有实例变量和方法. 继承实现了代码的重用,减少代码的编写量 python在类名后用圆括号来表示继承关系,括号中的类表示父类 如果父类有init方法,则子类会显示地调用其父类的init方法,不需要重写定义.如果子类需要拓展父类的init方法,则可以父类的

关于iOS、Android的交互 实践篇——主动调用

本文属于「Unity与iOS.Android平台的整合」系列文章之一.主要讲解Unity与iOS.Android平台相互主动调用实现 地址:http://www.jianshu.com/p/83c5736007f6

微信企业号开发一:主动调用模式之TOKEN申请

微信企业号开发,数据访问格式分为以下三种: 1.企业应用调用企业号提供的接口,管理或查询企业号后台所管理的资源.或给成员发送消息等,以下称主动调用模式. 2.企业号把用户发送的消息或用户触发的事件推送给企业应用,由企业应用处理,以下称回调模式. 3.用户在微信中阅读企业应用下发的H5页面,该页面可以调用微信提供的原生接口,使用微信开放的终端能力,以下称JSAPI模式: 官方文档地址:http://qydev.weixin.qq.com/wiki/index.php 现在我们来看一下主动调用模式的

类命名空间与对象、实例的命名空间和下面向对象的组合用法

创建一个类就会创建一个类的名称空间,用来存储类中定义的所有名字,这些名字称为类的属性 而类有两种属性:静态属性和动态属性 静态属性就是直接在类中定义的变量 动态属性就是定义在类中的方法 其中类的数据属性是共享给所有对象的 而类的动态属性是绑定到所有对象的 创建一个对象/实例就会创建一个对象/实例的名称空间,存放对象/实例的名字,称为对象/实例的属性 在自己的名称空间里找,找不到就去类中找,类也找不到就去找父类...最后找不到就会抛出异常 面向对象的组合用法 软件重用的重要方式除了继承之外还有一种

Python之面向对象的组合、多态、菱形问题、子类中重用父类的两种方式

一.组合 ''' 1.什么是组合 组合就是一个类的对象具备某一个属性,该属性的值是指向另外一个类的对象 2.为何用组合 组合也是用来解决类与类直接代码冗余问题的 3.如何用组合 ''' # 继承减少代码冗余,但是将类与类进行了强耦合,python不崇尚,所以能不用继承就尽量不用继承 class OldboyPeople: school = 'oldboy' def __init__(self, name, age, sex): self.name = name self.age = age se

【vue】父组件主动调用子组件 /// 非父子组件传值

一  父组件主动调用子组件: 注意:在父组件使用子组件的标签上注入ref属性,例如: <div id="home"> <v-header ref="header"></v-header> <hr> 首页组件 <button @click="getChildData()">获取子组件的数据和方法</button> </div> 父组件主动获取子组件的数据和方法: 1