鱼C论坛

 找回密码
 立即注册
查看: 737|回复: 9

[已解决]问个非常深奥的问题,有没有鱼油挑战一下

[复制链接]
发表于 2018-10-14 15:42:53 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x

class ProxyMetaclass(type):
    def __new__(cls,name,bases,attrs):
        attrs['CrawlFunc']=[]
        for k,v in attrs.items():
            if 'crawl_' in k:
                attrs['CrawlFunc'].append(v)
        return  type.__new__(cls,name,bases,attrs)

class ProxyGetter(object,metaclass=ProxyMetaclass):
    def test(self):
        for func in self.CrawlFunc:
            self.func()
    def crawl_360(self):
        print("360 成功")
    def crawl_baidu(self):
        print("百度 成功")
P=ProxyGetter()
P.test()

这段代码定义了一个元类抽取了子类的爬取函数,又把属性attrs的作为类对象ProxyGetter的属性返回给子类,但是调用ProxyGetter实例的test方法运行 提示报错,该对象没有这个属性
有没有资深鱼鱼研究指点一下。func(self)是可以运行成功的,但是为啥self.func运行不了。。。。。
最佳答案
2018-10-14 18:58:19
孤星破红尘 发表于 2018-10-14 17:50
朋友你看下我打印了一个func是方法

你这样直接加括号能用吗?  
你在for的时候,变量名叫func
引用的时候加括号就行了吗??  
肯定不行啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2018-10-14 15:51:38 From FishC Mobile | 显示全部楼层
报错  经过元类这么一改写 原来类的对象方法 变成不是对象方法了  但是就算这样 还是子类属性 对象应该是可以调用类属性的
5O[0O_XU1`Z9GQ2551@A6EE.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-10-14 16:03:24 | 显示全部楼层
这样试试
  1. self.CrawlFunc.func()
复制代码

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

使用道具 举报

 楼主| 发表于 2018-10-14 16:10:01 | 显示全部楼层

朋友 你这样写不行CrawlFunc是个方法的集合,运行不了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-10-14 16:28:47 | 显示全部楼层
孤星破红尘 发表于 2018-10-14 16:10
朋友 你这样写不行CrawlFunc是个方法的集合,运行不了

你是做一个ip池吧,  
这是由于你在 ProxyGetter还没定义func啊
self只是在 ProxyGetter中,
你for的只有func这个变量,加个括号并不代表它是一个方法,
应该需要func.xxx吧
你利用一下pyCharm可以提示一下的。  
例如在func后面加个点。  
看一下啊提示什么,有什么可选的。  
我类方面掌握不是很多,一般用类继承比较多,其他很少用
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-10-14 16:40:54 | 显示全部楼层
你还没生成实例对象,func还没识别成自己的函数
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-10-14 17:50:07 From FishC Mobile | 显示全部楼层
wongyusing 发表于 2018-10-14 16:28
你是做一个ip池吧,  
这是由于你在 ProxyGetter还没定义func啊
self只是在 ProxyGetter中,

朋友你看下我打印了一个func是方法
2Y_Q{SAAX_71(HBM40$Q4{C.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-10-14 17:57:48 From FishC Mobile | 显示全部楼层
塔利班 发表于 2018-10-14 16:40
你还没生成实例对象,func还没识别成自己的函数

func已经生成类对象是时候就已经成为类的属性函数了,你看我上面的打印输出  显示是两个类的函数
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-10-14 18:37:45 | 显示全部楼层
这是你生成实例后,问题就在你初始没成为实例的时候,懂吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-10-14 18:58:19 | 显示全部楼层    本楼为最佳答案   
孤星破红尘 发表于 2018-10-14 17:50
朋友你看下我打印了一个func是方法

你这样直接加括号能用吗?  
你在for的时候,变量名叫func
引用的时候加括号就行了吗??  
肯定不行啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-18 19:58

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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