Loading

自定模块

  • Thinkbayes.py

为函数和类的混合结构

  • 公共函数

最开始可以定义函数,作为后面类使用的公共函数

  • 父类

定义一个class作为父类

 
  class _DictWrapper(object):
    def __init__(self, values=None, name=''):

        self.name = name
        self.d = {}
        self.log = False

        if values is None:
            return

        init_methods = [
            self.InitPmf,
            self.InitMapping,
            self.InitSequence,
            self.InitFailure,
            ]

        for method in init_methods:
            try:
                method(values)
                break
            except AttributeError:
                continue

        if len(self) > 0:
            self.Normalize()

class传入了参数为object

注意其中name的定义,首先使用关键字参数,然后使用name属性进行绑定

定义一个初始字典,用于放置概率值

属性log为一个标记,其初始化为False

使用values进行辨识,如果参数为none,即进行return,不执行后面的操作(使用不带返回值的return可以提前结束定义的函数)

如果参数不为空,则会进行下一步操作

在循环内添加try-except进行异常处理,在except后添加continue,可以在发生错误的时候继续这个循环(跳过当前出错的循环位置)

def InitFailure(self, values):
        raise ValueError('None of the initialization methods worked.')

初始化是必须的一步,此处的初始化需要外部输入,如果没有外部输入,则raise一个错误

def __len__(self):
     return len(self.d)

此处使用的特殊类,在return时使用了内建函数

使用了__len__就可以在外部使用len(实例名)来获得实例的长度(此处就指定了实例的长度就是属性d的长度)

相当于使用__函数名__方法,来实现了一个属性函数,而不是使用方法来获得返回值

def __iter__(self):
     return iter(self.d)

使用内建的iter生成一个迭代器对象

即iter(实例名)就相当于对字典生成一个迭代器

def Copy(self, name=None):
        new = copy.copy(self)
        new.d = copy.copy(self.d)
        new.name = name if name is not None else self.name
        return new
def Scale(self, factor):
        new = self.Copy()
        new.d.clear()
        for val, prob in self.Items():
            new.Set(val * factor, prob)
        return new

 如果需要对实例中的属性进行更改,最后先浅复制一个实例,再对其操作之后返回这个实例

def Log(self, m=None):
        if self.log:
            raise ValueError("Pmf/Hist already under a log transform")
        self.log = True

        if m is None:
            m = self.MaxLike()

        for x, p in self.d.items():
            if p:
                self.Set(x, math.log(p / m))
            else:
                self.Remove(x)

 

 定义方法时,如果想要定义该方法的使用条件,可以在该方法的入口去判定标识符(标识符来自属性)

完成该方法后就更新标识符,其在属性上也会显示出来,表示该实例进行该操作

  • 子类
class Pmf(_DictWrapper):
    def Prob(self, x, default=0):
        return self.d.get(x, default)
    def Probs(self, xs):
        return [self.Prob(x) for x in xs]

 

此处继承了_DictWrapper这个类,进而可以使用之前定义的属性和方法

当然也可以重写方法

另外,对于轻量级的遍历,最好使用列表推导式,直接返回列表

total = self.Total()
if total == 0.0:
            raise ValueError('total probability is zero.')
            logging.warning('Normalize: total probability is zero.')
            return total

 

logging模块用于记录日志,warning是其中一个级别

logging.warning()会在控制台输出,其也可以记录到日志文件

 

posted @ 2020-11-05 22:08  lixin2020  阅读(111)  评论(0)    收藏  举报