Python 类组合(composition)和聚合(aggregation)

下面一段代码开始说起,知乎上有人问这个问题,说代码看不懂。

    #coding:utf-8
    #书中一个例子简单的短期利率类,折现是金融学中最基本的概念之一,在连续折现的固定短期利率世界中,日期t>0时未来现金流与当前日期t=0之间的折现因子为Do(t)=e(-rt)次方

    import numpy as np

    class short_rate(object):
        def __init__(self,name,rate):
            self.name=name
            self.rate=rate
        def get_discount_factors(self,time_list):
            time_list=np.array(time_list)
            return np.exp(-self.rate*time_list)

    class cash_flow_series(object):
        def __init__(self,name,time_list,cash_flows,short_rate):
            self.name=name
            self.time_list=time_list
            self.cash_flows=cash_flows
            self.short_rate=short_rate
        def present_value_list(self):
            df = self.short_rate.get_discount_factors(self.time_list)#想问这一行中为什么可以这样子不继承第一个类可以调用第一个类的函数呢
            return np.array(self.cash_flows)*df
        def net_present_value(self):
            return np.sum(self.present_value_list())

    class cfs_sensitivity(cash_flow_series):
        def npv_sensitivity(self,short_rates):
            npvs=[]
            for rate in short_rates:
                sr.rate=rate #这个实例化rate的意思是?
                npvs.append(self.net_present_value())
            return np.array(npvs)

    short_rates=[0.01,0.025,0.05,0.075,0.1,0.125,0.15,0.2]
    cash_flows=np.array([-100,50,75])
    time_list=[0.0,1.0,2.0]

    sr=short_rate('r',0.05)

    print sr.get_discount_factors(time_list)

    sr.rate=0.05
    cfs=cash_flow_series('cfs0',time_list,cash_flows,sr)
    print cfs.present_value_list()

 

    cfs_sens=cfs_sensitivity('cfs',time_list,cash_flows,sr)

    npvs=cfs_sens.npv_sensitivity(short_rates)

    print npvs
上面的代码命名很糟糕,提问者说是书Python金融大数据分析 (豆瓣) P350页上的代码。 稍微修改一下

    # coding:utf-8
    # 书中一个例子简单的短期利率类,折现是金融学中最基本的概念之一,在连续折现的固定短期利率世界中,日期t>0时未来现金流与当前日期t=0之间的折现因子为Do(t)=e(-rt)次方

    import numpy as np

    class ShortRate(object):

        def __init__(self, name, rate):
            self.name = name
            self.rate = rate

        def get_discount_factors(self, time_list):
            time_list = np.array(time_list)
            return np.exp(-self.rate * time_list)

    class CashFlowSeries(object):

        def __init__(self, name, time_list, cash_flows, short_rate):
            self.name = name
            self.time_list = time_list
            self.cash_flows = cash_flows
            self.short_rate = short_rate

        def present_value_list(self):
            df = self.short_rate.get_discount_factors(
                self.time_list)  # 想问这一行中为什么可以这样子不继承第一个类可以调用第一个类的函数呢
            return np.array(self.cash_flows) * df

        def net_present_value(self):
            return np.sum(self.present_value_list())

    class CfsSensitivity(CashFlowSeries):

        def npv_sensitivity(self, ShortRates):
            npvs = []
            for rate in ShortRates:
                sr.rate = rate  # 这个实例化rate的意思是?
                npvs.append(self.net_present_value())
            return np.array(npvs)

    ShortRates = [0.01, 0.025, 0.05, 0.075, 0.1, 0.125, 0.15, 0.2]
    cash_flows = np.array([-100, 50, 75])
    time_list = [0.0, 1.0, 2.0]

    sr = ShortRate('r', 0.05)

    print sr.get_discount_factors(time_list)

    sr.rate = 0.05
    cfs = CashFlowSeries('cfs0', time_list, cash_flows, sr)
    print cfs.present_value_list()

    cfs_sens = CfsSensitivity('cfs', time_list, cash_flows, sr)

    npvs = cfs_sens.npv_sensitivity(ShortRates)

    print npvs
提问者提出其中df = self.short_rate.get_discount_factors(self.time_list) 这条语句不是很明白。

1、这个一个面向对象中类聚合的概念。
2、需要看CashFlowSeries 类的初始化方法中 self.short_rate = short_rate
short_rate 是ShortRate 类的实例,但你的代码命名有问题,ShortRate 的实例调用自己的实例方法,没有问题。

3、sr.rate = rate # 这个实例化rate的意思是?
要从下面语句看,sr 就是下面的sr 这个sr 是ShortRate的实例。sr 有实例属性rate.
sr.rate = 0.05
cfs = CashFlowSeries('cfs0', time_list, cash_flows, sr)
类之间有多种关系,请大家看维基百科,类别图 下面主要介绍聚合(Aggregation)以及组合(Composition)。

聚合(aggregation):指的是整体与部分的关系。通常在定义一个整体类后,再去分析这个整体类的组成结构。从而找出一些组成类,该整体类和组成类之间就形成了聚合关系。需求描述中“包含”、“组成”、“分为…部分”等词常意味着聚合关系。

组合(composition):也表示类之间整体和部分的关系,但是组合关系中部分和整体具有统一的生存期。一旦整体对象不存在,部分对象也将不存在。部分对象与整体对象之间具有共生死的关系。

请看下面的代码。类组合,Computer实例对象不存在了,内部组合的Cpu实例也不存在。聚合Computer实例对象不存在了,从初始化方法传入的Cpu实例不属Computer实例对象存在不存在的影响。

#! /usr/bin/env python
# coding:utf-8

'''
类对象组合关系
'''

class Cpu(object):

    def __init__(self):
        self.type = '286'

class Computer(object):

    def __init__(self):
        self.cpu = Cpu()  # 包含CPu类的实例对象

    def __del__(self):
        print "Cpu by by!"

old_computer = Computer()
del old_computer

#! /usr/bin/env python
# coding:utf-8

'''
类对象聚合关系
'''

class Cpu(object):

    def __init__(self):
        self.type = '286'

class Computer(object):

    def __init__(self, cpu):
        self.cpu = cpu  # 有一个CPu类的实例对象

    def __del__(self):
        print "没有权力和Cpu by by!"

old_cpu = Cpu()
old_computer = Computer(old_cpu)
del old_computer

 

时间: 2024-10-08 03:12:51

Python 类组合(composition)和聚合(aggregation)的相关文章

Java基础教程之组合(composition)_java

我们已经尝试去定义类.定义类,就是新建了一种类型(type).有了类,我们接着构造相应类型的对象.更进一步,每个类型还应该有一个清晰的接口(interface),供用户使用. 我们可以在一个新类的定义中使用其他对象.这就是组合(composition).组合是在Java中实现程序复用(reusibility)的基本手段之一. 组合与"has-a" 一个对象是另一个对象的数据成员.比如我们看之前提到的充电电筒的例子: 一个充电电筒中的电池.LED灯.按钮-- 都可以是一个对象.我们可以定

Python类继承的实现

代码: #! /usr/bin/python # Filename: inherit.py # Author: yanggang class SchoolMember: def __init__(self,name,age): self.name = name self.age = age print 'init SchoolMember: ', self.name def tell(self): print 'name:%s; age:%s' % (self.name, self.age) c

python类装饰器用法实例

  本文实例讲述了python类装饰器用法.分享给大家供大家参考.具体如下: ? 1 2 3 4 5 6 7 8 9 10 11 #!coding=utf-8 registry = {} def register(cls): registry[cls.__clsid__] = cls return cls @register class Foo(object): __clsid__ = '123-456' def bar(self): pass print registry 运行结果如下: {'

Python类的用法实例浅析

  本文实例讲述了Python类的用法.分享给大家供大家参考.具体如下: 先看一段代码: ? 1 2 3 4 5 6 7 8 9 #!/usr/bin/env python class Test: def __init__(self,msg="hello"): self.wel=msg print "init" def go(self,name,do): print self.wel+"go! "+name+" "+do d=

python类继承用法实例分析

  本文实例讲述了python类继承用法.分享给大家供大家参考.具体如下: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73

python类和函数中使用静态变量的方法

  本文实例讲述了python类和函数中使用静态变量的方法.分享给大家供大家参考.具体分析如下: 在python的类和函数(包括λ方法)中使用静态变量似乎是件不可能[Nothing is impossible]的事, 但总有解决的办法,下面通过实现一个类或函数的累加器来介绍一些较为非主流的方法 方法一.通过类的__init__和__call__方法 ? 1 2 3 4 5 6 7 8 9 10 11 class foo: def __init__(self, n=0): self.n = n d

Python类属性与实例属性用法分析

  本文实例分析了Python类属性与实例属性用法.分享给大家供大家参考.具体如下: 类属性:类名.属性名 实例属性:实例.属性名 ? 1 2 3 4 5 6 7 8 9 10 11 12 >>> class test(): ... ver=1 ... >>> a=test() >>> test.x=8 >>> a.__dict__ {} >>> a.x 8 >>> a.x=9 >>&g

Python类定义和类继承详解

  这篇文章主要介绍了Python类定义和类继承详解,本文讲解了类的私有属性.类的方法.私有的类方法.类的专有方法.类的定义.类的单继承.类的多继承等内容,需要的朋友可以参考下 一.类定义: ? 1 2 class <类名>: <语句> 类实例化后,可以使用其属性,实际上,创建一个类之后,可以通过类名访问其属性 如果直接使用类名修改其属性,那么将直接影响到已经实例化的对象 类的私有属性: __private_attrs 两个下划线开头,声明该属性为私有,不能在类地外部被使用或直接访

Python类的定义、继承及类对象使用方法简明教程

  这篇文章主要介绍了Python类的定义.继承及类对象使用方法简明教程,本文用浅显易懂的语言讲解了类的定义.继承及类对象的使用,非常实用易懂,需要的朋友可以参考下 Python编程中类的概念可以比作是某种类型集合的描述,如"人类"可以被看作一个类,然后用人类这个类定义出每个具体的人--你.我.他等作为其对象.类还拥有属性和功能,属性即类本身的一些特性,如人类有名字.身高和体重等属性,而具体值则会根据每个人的不同;功能则是类所能实现的行为,如人类拥有吃饭.走路和睡觉等功能.具体的形式如