鱼C论坛

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

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

  [复制链接]
发表于 2018-8-27 10:21:17 | 显示全部楼层
先记下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-10-31 19:43:49 | 显示全部楼层
__bases__的两种方式运行出错,插件看不懂
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-11-1 21:23:57 | 显示全部楼层
18853068 发表于 2015-8-20 16:06
Python 2下运行通过。。Python3下不行

额,sad,还浪费了我好一会儿
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-11-4 10:33:26 | 显示全部楼层
加油,不放弃
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-11-14 11:46:18 | 显示全部楼层
第三个看不懂,难过。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-11-15 22:24:21 | 显示全部楼层
本帖最后由 Lidapao 于 2018-11-15 22:33 编辑

第二个方法__bases__ 在python3中好像不能使用。

解释一下插件方式:
因为AFeature 和BFeature都是继承自PlugIn的,所以他们中也有plugin 和 plugout方法(接下来就以AFeature类进行解释,BFeature和AFeature一样)

AFeature().plugin(c) 实则是运行了以下代码
for f in AFeature._exported_methods:        #  AFeature中存放get_a_value的列表
        c.__dict__[ get_a_value] = f        # 字典中给一个不存在的keys赋值会创建新的keys和对应value之前字典中讲过
给c.__dict__中添加get_a_value方法

因为在AFeature.__init__中初始化了PlugIn的__init__所以他们中也有_exported_methods列表,就是存放方法的列表
在这个列表中存放的是get_a_value这个方法。
所以c中就有了get_a_value方法
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 2 反对 0

使用道具 举报

发表于 2018-11-24 09:54:54 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-11-25 17:04:12 | 显示全部楼层
本帖最后由 MrClown 于 2018-11-25 17:05 编辑

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

使用道具 举报

发表于 2019-1-14 11:06:16 | 显示全部楼层
最后一张的代码写的太好了,一目了然
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-1-14 22:05:59 | 显示全部楼层
先马后看
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-1-23 15:45:49 | 显示全部楼层
说明一下,最后一段代码:
1、是通过修改类对象Combine之引用c的字典键值,获得AFeature的方法get_a_value
2、这段代码的目的是:只想针对类对象的引用c进行扩展方法。而不要用多继承或__base__那样,直接把Afeature的方法属性直接继承给Combine类。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-2-18 11:58:13 | 显示全部楼层
非常感谢甲鱼大佬对于,Mix-in的拓展【即使,编程属于已过一段时间,但是内容也是很值得看得】
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-2-18 12:06:44 | 显示全部楼层
本帖最后由 darksolitary 于 2019-2-18 20:24 编辑

# __bases__方法:在python3.+以上,可以是查看某个类继承的所有父类【但是修改的话不行】,

亲测(编译器:3.0+),附代码:


lass PlugIn(object):
    def __init__(self):
        self._exported_methods = []
        
    def plugin(self, owner):
        for f in self._exported_methods:
            owner.__dict__[f.__name__] = f

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

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

class BFeature(PlugIn):
    def __init__(self):
        super().__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()

AFeature.__bases__ += (BFeature)        #这行注释掉,就没错
print(AFeature.__bases__)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-2-18 12:12:49 | 显示全部楼层
# __bases__方法是查看某个类继承的所有父类
在python3.0+上(我也是猜测:因为我用的是小甲鱼推荐的3.0+版本),是可以实现上述功能的,但是却无法实现添加父类功能

附上代码:

class PlugIn(object):
    def __init__(self):
        self._exported_methods = []
        
    def plugin(self, owner):
        for f in self._exported_methods:
            owner.__dict__[f.__name__] = f

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

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

class BFeature(PlugIn):
    def __init__(self):
        super().__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()

AFeature.__bases__ += (BFeature)    #测试是否可添加新父类,报错
print(AFeature.__bases__) #测试是否可以查看所有父类,可以
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-2-18 12:19:22 | 显示全部楼层
本帖最后由 darksolitary 于 2019-2-18 12:23 编辑

lass PlugIn(object):
    def __init__(self):
        self._exported_methods = []
        
    def plugin(self, owner):
        for f in self._exported_methods:
            owner.__dict__[f.__name__] = f  #将已存储完的函数名列表中的数据,通过循环添加到“owner”所拥有的__dict__(我理解是:用于存储自身方法的“字典类型:的属性),进而完成对象方法扩展

class AFeature(PlugIn):
    def __init__(self):
        super().__init__()  #创建能存储自己所含的函数名列表
        self._exported_methods.append(self.get_a_value) #存储

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

class BFeature(PlugIn):
    def __init__(self):
        super().__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()

AFeature.__bases__ += (BFeature)   
print(AFeature.__bases__)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-2-18 12:23:53 | 显示全部楼层
lass PlugIn(object):
    def __init__(self):
        self._exported_methods = []
        
    def plugin(self, owner):
        for f in self._exported_methods:
            owner.__dict__[f.__name__] = f  #将已存储完的函数名列表中的数据,通过循环添加到“owner”所拥有的__dict__(我理解是:用于存储自身方法的“字典类型:的属性),进而完成对象方法扩展

class AFeature(PlugIn):
    def __init__(self):
        super().__init__()  #创建能存储自己所含的函数名列表
        self._exported_methods.append(self.get_a_value) #存储

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

class BFeature(PlugIn):
    def __init__(self):
        super().__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()

AFeature.__bases__ += (BFeature)   
print(AFeature.__bases__)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-3-20 21:29:50 | 显示全部楼层
几个意思啊?  不明觉厉啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-3-20 22:02:22 | 显示全部楼层
本帖最后由 fishzang 于 2019-3-20 22:03 编辑

super(AFeature, self).__init__()

self 不是放在方法的第一个吗? 为什么前面加了一个 “AFeature”类名?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-5-30 17:41:13 | 显示全部楼层
希望 小甲鱼 快点更新 有些代码对不上了   教程老了   不过 核心不变
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-6-7 17:25:34 | 显示全部楼层
目前阻力比较大,应该多学几遍
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-24 15:13

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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