鱼C论坛

 找回密码
 立即注册
楼主: 小甲鱼

[扩展阅读] Python Mixin 编程机制(转)

  [复制链接]
发表于 2019-7-12 16:41:12 | 显示全部楼层
NB!谢谢老师
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-7-15 16:44:01 | 显示全部楼层
看不懂诶
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-8-17 13:12:21 | 显示全部楼层
努力塞
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-8-24 18:02:22 | 显示全部楼层
最后一个看不懂,需要好好理解
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-9-29 21:40:31 | 显示全部楼层
努力學習中~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-10-21 03:47:20 | 显示全部楼层
不太懂.. 还得加油啊.
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-12-27 09:16:03 | 显示全部楼层
额~~__bases__那个例子程序运行不出来,,,求解。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-1-9 15:30:03 | 显示全部楼层
那么问题来了,__bases__ 和  __dict__两个方法你都没讲,,, __bases__看着还能猜到,,但是__dict__完全就不知道了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-1-9 15:57:40 | 显示全部楼层
也不回复,出错了也没人解决,这个第三个代码出的云里雾里,也没有具体解释。。。我很好奇小甲鱼都在干什么,想充会员买题目的我看到这犹豫了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2020-1-11 00:05:32 | 显示全部楼层
本帖最后由 zmz1054920870 于 2020-1-11 00:06 编辑
jiexinren 发表于 2015-8-3 16:04
这个在我电脑上无法运行啊(3.4.3,64位版本)
Traceback (most recent call last):
  File "E:/桌面/j ...


我这里是针对 python 3.x 来说的哈    C.__bases__ 的作用是,调取C类的所以直接父类,他都没有进行继承,哪里来的父类,所以会报错。也可以说成C.__bases__ 是 class “__main__ .C ” 的一个父类,我们可以把代码改一下,把class C 改成  class C(B)
这样我们可以执行了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-1-11 00:29:27 | 显示全部楼层
jiexinren 发表于 2015-8-3 16:04
这个在我电脑上无法运行啊(3.4.3,64位版本)
Traceback (most recent call last):
  File "E:/桌面/j ...

class A:
    def pA(self):
        print('我是A')

class B:
    def pB(self):
        print('我是B')

class C(Before_C):
    def c(self):
        pass
class Before_C:
        pass
C.__bases__+=(A,B,)
这样你就可以了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-1-16 13:43:25 | 显示全部楼层
看着头晕晕,
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-1-29 16:30:41 | 显示全部楼层
感谢分享,Plug方法部分是python2.x吧,语法上有些和P.3不同
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-4 22:13:41 | 显示全部楼层
分解了第三段代码的执行逻辑大概如下,看起来像是把一个方法定义到了这个空类里,但是我现在还不太明白__name__是一个内部的魔法方法吗?为什么给c的魔法字典里添加了新的映射关系就可以调用到这个方法了

>>> def get_a_value():
        print('a feature.')

       
>>> exported_methods = []
>>> exported_methods.append(get_a_value)
>>> exported_methods[0]
<function get_a_value at 0x0000000002FD8550>
>>> class Combine:pass

>>> c = Combine()
>>> c.__dict__
{}
>>> c.__dict__[get_a_value.__name__] = exported_methods[0]
>>> c.__dict__
{'get_a_value': <function get_a_value at 0x0000000002FD8550>}
>>> c.get_a_value()
a feature.
>>>

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-5 10:29:55 | 显示全部楼层
感谢分享,收藏
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-25 10:23:55 | 显示全部楼层
基本上没看懂
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-26 20:05:23 | 显示全部楼层
为啥试了案例__bases__第一行代码出现:
TypeError: Cannot create a consistent method resolution
order (MRO) for bases object, B
错误提示呀?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-26 20:33:44 | 显示全部楼层
经过多次试验,Python3中__bases__属性实现给类A添加类B特性的条件是:
A、B分别是一个继承类,且继承于不同的基类

【实例代码如下:】
class X:
        pass

class A(X):
        def get_a(self):
                print('a')


class Y:
        pass

class B(Y):
        def get_b(self):
                print('b')

A.__bases__
B.__bases__
A.__bases__ += (B,)
a = A()
a.get_b()
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-3 09:53:42 | 显示全部楼层
class PlugIn(object):
    def __init__(self):
        self._exported_methods = []
        
    def plugin(self, owner):
        for f in self._exported_methods:
            owner.__dict__[f.__name__] = f

    def plugout(self, owner):
        for f in self._exported_methods:
            del owner.__dict__[f.__name__]

class AFeature(PlugIn):
    def __init__(self):
        super(AFeature, self).__init__()
        self._exported_methods.append(self.get_a_value)

    def get_a_value(self):
        print 'a feature.'

class BFeature(PlugIn):
    def __init__(self):
        super(BFeature, self).__init__()
        self._exported_methods.append(self.get_b_value)

    def get_b_value(self):
        print 'b feature.'

class Combine:pass

c = Combine()
AFeature().plugin(c)
BFeature().plugin(c)

c.get_a_value()
c.get_b_value()



问:super(AFeature, self)和super(BFeature, self)这两个参数为什么要放,我改成super().__init__() 运行结果是一样的,请问这里有什么区别呢??????
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-3 15:04:06 | 显示全部楼层
还需努力,噶油
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-22 02:34

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表