• 为了保证你在浏览本网站时有着更好的体验,建议使用类似Chrome、Firefox之类的浏览器~~
    • 如果你喜欢本站的内容何不Ctrl+D收藏一下呢,与大家一起分享各种编程知识~
    • 本网站研究机器学习、计算机视觉、模式识别~当然不局限于此,生命在于折腾,何不年轻时多折腾一下

oop之继承nametuple

Python admin 2年前 (2017-07-01) 1157次浏览 0个评论 扫描二维码

最近在 spark 上研究 fp-growth 算法,其中 fpmodel 中其中一个方法 freqItemsets 生成频繁集,但是生成的结果不方便用户后续统计处理,下面贴出源码

 

class FPGrowthModel(JavaModelWrapper):

    """
    .. note:: Experimental

    A FP-Growth model for mining frequent itemsets
    using the Parallel FP-Growth algorithm.

    >>> data = [["a", "b", "c"], ["a", "b", "d", "e"], ["a", "c", "e"], ["a", "c", "f"]]
    >>> rdd = sc.parallelize(data, 2)
    >>> model = FPGrowth.train(rdd, 0.6, 2)
    >>> sorted(model.freqItemsets().collect())
    [FreqItemset(items=[u'a'], freq=4), FreqItemset(items=[u'c'], freq=3), ...

    .. versionadded:: 1.4.0
    """

    @since("1.4.0")
[docs]    def freqItemsets(self):
        """
        Returns the frequent itemsets of this model.
        """
        return self.call("getFreqItemsets").map(lambda x: (FPGrowth.FreqItemset(x[0], x[1])))

上面的类方法 freqItemsets 生成频繁集,但是不想在 map 将其转化为 FreqItemset 对象类型

class FreqItemset(namedtuple("FreqItemset", ["items", "freq"])):
        """
        Represents an (items, freq) tuple.

        .. versionadded:: 1.4.0
        """

FreqItemset 是从 nametuple 继承,内部没有重写任何方法函数,因此在调用 FreqItemset 时会自动构造成相应的 nametuple 对象

如果你想继续定制当前的类,需要自己重写相关的方法,比如参数增加,现在默认传递的参数只有两个,你要是增加为三个或者多个该如何处理呢,这个就会涉及的到以下内容
__init__ 与 __new__ 两个函数之间的关系

from collections import namedtuple 

Test=namedtuple('Test', 'name age ')



class xman(Test):
    
    def  __new__(cls,a,b,c):
        self=super(xman,cls).__new__(cls,a,b)
        self.c=c
        return self
    

if __name__=='__main__':
    
    x=xman('a',11,'one')
    
    print x 
    
    print x.c

输出结果

Test(name='a', age=11)
one

要是上述代码改为以下:

from collections import namedtuple 

Test=namedtuple('Test', 'name age ')



class xman(Test):
    #error
    def __init__(self,a,b,c):
        super(xman,self).__init__(self,a,b)
        self.c=c

if __name__=='__main__':
    
    x=xman('a',11,'one')
    
    print x 
    
    print x.c

Traceback (most recent call last):
  File "C:\Users\cuijian\Desktop\dp_blog\BlogTestCode\NametupleTest.py", line 17, in <module>
    x=xman('a',11,'one')
TypeError: __new__() takes exactly 3 arguments (4 given)

这就是实际 nametuple 只需要两个参数就好了,你现在在构造对象的时候传入了过多的参数,这也是说明了
__new__ 在 __init__ 之前被调用,一般情况下不会去修改 __new__ 方法,因为如果你要控制对象的构造过程就需要去修改这个函数,否则
只是初始化实例的话是不需要重写当前的函数。


Deeplearn, 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明oop 之继承 nametuple
喜欢 (0)
admin
关于作者:
互联网行业码农一枚/业余铲屎官/数码影音爱好者/二次元

您必须 登录 才能发表评论!