首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >从其他实例属性派生的实例属性

从其他实例属性派生的实例属性
EN

Stack Overflow用户
提问于 2019-12-03 12:22:15
回答 1查看 562关注 0票数 2

我很抱歉,如果标题是神秘的,我想不出用一个句子来描述我的问题。我正在用python2.7构建一些代码,我将在下面描述。

最小工作实例

我的代码有一个Parameter类,它实现了namevalue等属性,类似于下面的内容。

代码语言:javascript
运行
AI代码解释
复制
class Parameter(object):
    def __init__(self, name, value=None, error=None, dist=None, prior=None):
        self.name   = name
        self._value = value # given value for parameter, this is going to be changed very often in an MCMC sampler
        self.error  = error # initial estimate of error for the parameter, will only be set once
        self._dist  = dist # a distribution for the parameter, will only be set once
        self.prior  = prior

    @property
    def value(self):
        return self._value

    @property
    def dist(self):
        return self._dist

该类还具有几个属性,如果给定分布,则返回Parameter.dist的平均值、中值等。

我还有另一个类,例如ParameterSample,它创建了一个包含不同Parameter对象的填充。其中一些Parameter对象具有使用Parameter.set_parameter()函数设置的属性(例如valueerror),但其他一些Parameter对象没有显式设置,但它们的valuedist属性依赖于设置的其他Parameter对象:

代码语言:javascript
运行
AI代码解释
复制
class ParameterSample(object):
    def __init__(self):
        varied_parameters  = ('a', 'b') # parameter names whose `value` attribute is varied
        derived_parameters = ('c',) # parameter names whose `value` attribute is varied, but depends on `a.value` and `b.value`
        parameter_names    = varied_parameters + derived_parameters
        
        # create `Parameter` objects for each parameter name
        for name in parameter_names:
            setattr(self, name, Parameter(name))

    def set_parameter(self, name, **kwargs):
        for key, val in kwargs.items():
            if key == 'value':
                key = '_'.join(['', key]) # add underscore to set `Parameter._value`
            setattr(getattr(self, name), key, val) # basically does e.g. `self.a.value = 1`

我现在可以创建一个ParameterSample并像这样使用它们:

代码语言:javascript
运行
AI代码解释
复制
parobj = ParameterSample()
parobj.set_parameter('a', value=1, error=0.1)
parobj.set_parameter('b', value=2, error=0.5)

parobj.a.value
>>> 1
parobj.b.error
>>> 0.5

parobj.set_parameter('b', value=3)
parobj.b.value
>>> 3
parobj.b.error
>>> 0.5

我想要的

我最终想要的是,以同样的方式使用Parameter.c。例如:

代码语言:javascript
运行
AI代码解释
复制
parobj.c.value
>>> 4 # returns parobj.a.value + parobj.b.value
parobj.c.dist
>>> None # returns a.dist + b.dist, but since they are not currently set it is None

因此,c需要是一个Parameter对象,具有与ab相同的属性,但是它的valuedist根据ab的当前属性进行更新。

但是,我还应该提到,我希望能够为参数c设置允许的先验范围,例如,在调用其值之前设置parobj.set_parameter('c', prior=(0,10)) --因此在创建ParameterSample对象时,c需要是一个已经定义的Parameter对象。

我将如何将其实现到我的ParameterSample类中?

我试过的

我已经试着去做我自己的装潢师了,但是我不确定这是不是该走的路,因为我不完全明白我将如何使用这些。

我还考虑过在c中添加一个@属性,它在每次调用Parameter对象时都会创建一个新的Parameter对象,但我觉得这样做并不合适,因为它可能会减慢代码的速度。

我还应该指出,上面的ParameterSample类将在不同的类中继承,因此无论解决方案是什么,都应该能够在此设置中使用:

代码语言:javascript
运行
AI代码解释
复制
class Companion(ParameterSample)
    def __init__(self, name):
        self.name = name
        super(Companion, self).__init__()

comp = Companion(name='Earth')
comp.set_parameter('a', value=1)
comp.set_parameter('b', value=3)
comp.c.value
>>> 4
EN

回答 1

Stack Overflow用户

发布于 2019-12-03 13:25:19

我无法让它在Python2中工作-- setattr调用似乎从未将属性传播到子类(Companion将没有c属性)。

不过,我在Python 3方面更成功。由于您有两种参数类型(不同的和派生的),所以有两个类来实现行为是有意义的,而不是把它们都当作一个。

我添加了一个DerivedParameter类,继承自接受dependents参数(以及其父类‘args/kwargs)的Parameter,但是重新定义valuedist以提供依赖行为:

代码语言:javascript
运行
AI代码解释
复制
class DerivedParameter(Parameter):
    def __init__(self, name, dependents, **kwargs):
        self._dependents = dependents
        super().__init__(name, **kwargs)

    @property
    def value(self):
        try:
            return sum(x._value for x in self._dependents if x is not None)
        except TypeError:
            return None

    @property
    def dist(self):
        try:
            return sum(x._dist for x in self._dependents if x is not None)
        except TypeError:
            return None

然后,我调整了添加参数对象的方式:

代码语言:javascript
运行
AI代码解释
复制
class ParameterSample:
    def __init__(self):
        # Store as instance attributes to reference later
        self.varied_params  = ('a', 'b') # parameter names whose `value` attribute is varied
        self.derived_params = ('c',) # parameter names whose `value` attribute is varied, but depends on `a.value` and `b.value`
        # No more combined names

        # create `Parameter` objects for each varied parameter name
        for name in self.varied_params:
            setattr(self, name, Parameter(name))

        # Create `DerivedParameter` objects for each derived parameter
        # Derived parameters depend on all `Parameter` objects. It wasn't
        # clear if this was the desired behavior though.
        params = [v for _, v in self.__dict__.items() if isinstance(v, Parameter)]
        for name in self.derived_params:
            setattr(self, name, DerivedParameter(name, params))

    def set_parameter(self, name, **kwargs):
        for key, val in kwargs.items():
            if key == 'value':
                key = '_'.join(['', key]) # add underscore to set `Parameter._value`
            setattr(getattr(self, name), key, val) # basically does e.g. `self.a.value = 1`

这样,我就可以复制给定的示例所需的行为:

代码语言:javascript
运行
AI代码解释
复制
>>> comp = Companion(name='Earth')
>>> comp.set_parameter('a', value=1)
>>> comp.set_parameter('b', value=3)
>>> print(comp.c.value)
>>> print(comp.c.dist)
4
None
>>> comp.set_parameter('c', prior=(0,10))
>>> print(comp.c.prior)
(0, 10)

正如我在注释中指出的那样,上面的设计最终导致所有派生参数都使用所有不同的参数作为其依赖项--有效地使c和潜在的d完全相同。您应该能够很容易地通过一些参数/条件来修复这个问题。

总之,我不得不同意“错误-句法上的悔恨”。这是一种非常复杂的设计类的方法,最多也会使维护混乱。我强烈鼓励您重新考虑您的设计,并试图找到一种适应性强的通用解决方案,而不涉及像这样的属性的动态创建。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59164763

复制
相关文章
ObservableCollection 类
Windows Presentation Foundation (WPF) 在 Microsoft .NET Framework 中添加了一些功能,您可以可靠地使绑定控件与其数据源保持一致。这个类就是ObservableCollection<T>。 利用 ObservableCollection 类,WPF /Silverlight 应用程序可以使绑定控件与基础数据源保持同步,但它还提供了更有用的信息,尤其是 ObservableCollection 类还可以在您添加、删除、移动、刷新或替换集合中的项目时引
张善友
2018/01/31
1.2K0
多视图多示例多标签的协同矩阵分解
题目: Multi-View Multi-Instance Multi-Label Learning based on Collaborative Matrix Factorization
张小磊
2021/04/01
1.1K0
WPF 解决 ObservableCollection 提示 Cannot change ObservableCollection during a CollectionChanged event 异
本文告诉大家在使用 ObservableCollection 时,抛出 InvalidOperationException 异常,提示 Cannot change ObservableCollection during a CollectionChanged event 内容,的原因和解决方法
林德熙
2022/08/12
1.1K0
WPF-带填充的 WrapPanel
我意识到很多人都需要和我一样的布局容器:一个WrapPanel,可以用一个或多个子控件填充右边空白空间(Orientation=Horizontal,站长注:注意了哦,不一定填充的是在最左边,也不一定是最右边,可以是中间哦)。我决定编写一个可重复使用的控件来在两个方向上完成这项工作。
沙漠尽头的狼
2023/02/10
5720
WPF-带填充的 WrapPanel
多视图聚类总结
互补原则:该原则规定,为了更全面、更准确地描述数据对象,应该使用多个视图。在多视图数据的上下文,每个视图都足以完成特定的知识发现任务。然而,不同的视图通常包含相互补充的信息。例如,在图像处理领域,每幅图像都由不同类型的特征来描述,如lbp、sift和hog,其中lbp是一种强大的纹理特征,sift对图像的光照、噪声和旋转具有鲁棒性,而hog对边缘信息敏感。因此,有必要利用这些相互补充的信息来描述这些数据对象,并对内部集群提供更深入的见解。
计算机与AI
2020/12/03
2.3K0
多视图聚类总结
学习多视图立体机
去考虑看一张椅子的照片。即使我们以前从未见过这样的椅子,但我们人类有出色的能力,可以从这单张照片中推断出这张椅子的三维形状。可以证明人类经验主义的一个更具代表性的例子就是,我们和椅子共处于同一个物理空间中,并从不同的角度积累信息,在我们的脑海中可以组建起这个椅子的三维形状。这个复杂的二维到三维的推理任务,我们是怎样完成的?我们又是使用什么样的线索? 从仅有的几个视角,我们是怎样无缝整合这些信息并且建立一个整体的三维场景模型?
花落花飞去
2018/02/01
2.3K0
WPF 列表控件数据源绑定多个数据集合方法
在 WPF 用的多的列表控件如 ListBox 或 ListView 等,本文告诉大家在这些列表控件上进行绑定多个数据集合来源的多个实现方法。如有一个显示动物列表的控件,需要绑定的数据来源是阿猫和阿狗两个 ObservableCollection 列表,不在后台代码编写合并集合的代码情况下,可以通过 XAML 的编写,绑定多个数据集合
林德熙
2021/05/27
3.6K0
C# ObservableCollection和List的区别
1)ObservableCollection比较简单,继承了Collection, INotifyCollectionChanged, INotifyPropertyChanged
zls365
2021/02/26
2K0
AngularJS 多视图应用中的登录认证
在 AngularJS 的多视图应用中, 一般都有实现登录认证的需求, 最简单的解决方法是结合服务端认证, 做一个单独的登录页面, 登录完成之后再跳转回来, 这种方法当然可取, 不过就破坏了单页面应用 (SPA) 的体验, 追求完美的开发者肯定不会采用这种方法。
beginor
2020/08/10
2.8K0
理解 UWP 视图的概念,让 UWP 应用显示多个窗口(多视图)
发布于 2018-07-27 01:19 更新于 2018-07-29 23:53
walterlv
2018/09/18
1.5K0
理解 UWP 视图的概念,让 UWP 应用显示多个窗口(多视图)
PAMI 2020|基于深度对抗方法处理视图缺失的多视图学习
今天给大家介绍天津大学张长青老师等人在IEEE T-PAMI 2020上发表的文章“Deep Partial Multi-View Learning”。为了提高在视图缺失情况下的多视图学习性能,增强潜在表示的完备性,本文在给出多视图的完备性和通用性定义的基础上,基于提出的CPM-Nets算法,引入对抗策略,对缺失视图进行处理,提高了模型的完备性,并提出一种非参数分类损失进行优化。
智能生信
2021/02/04
2.7K0
Django Rest Framework 视图(上)
在之前的 django rest framework,其它组件中,在视图函数中继承类都是 rest_framework.view.APIView,这个 APIView 是继承的 django 中的 View 并且做了封装和方法重写。那么在 django rest framework 中,还有没有提供其它的类能够继承?
小团子
2019/07/18
9570
Django Rest Framework 视图(上)
PMVS:多视图匹配经典算法
导语:Multi-View Stereo(MVS)多视图立体匹配与三维重建的任务是:以已知内外参数的多幅图像(SfM的结果)为输入,重建出真实世界中物体/场景的三维模型。
3D视觉工坊
2021/11/19
9990
PMVS:多视图匹配经典算法
PMVS:多视图匹配经典算法
导语:Multi-View Stereo(MVS)多视图立体匹配与三维重建的任务是:以已知内外参数的多幅图像(SfM的结果)为输入,重建出真实世界中物体/场景的三维模型。 本文作者提出了PMVS的经典算法,深入了解传统算法的实现效果,可以帮助我们与基于深度学习的方法进行对比,对“如何评估多个视图间相似性”这一问题有更深刻的认识,希望能对相关研究人员有一定的参考帮助。
计算机视觉
2021/11/19
7820
PMVS:多视图匹配经典算法
laravel多视图共享数据方法
1.首先打开app下的Providers目录找到 AppServiceProvider 2.在boot中调用视图composer如下 public function boot() { view()->composer( 'Common/home_menu', 'App\Http\Controllers\Home\IndexController@getConfig' ); } 如上操作即可多视图共享数据
素描
2019/09/19
8060
WPF 使用 RenderTargetBitmap 快速截图出现 COMException 提示
本文告诉大家一个最简单步骤让 RenderTargetBitmap 出现 COMException 提示
林德熙
2019/03/13
1.5K0
传统多视图立体算法:PatchMatchStereo详解
多视图立体技术是一种从已知相机内外参数的多个视角的彩色影像中,利用立体匹配算法恢复立体结构的三维视觉技术。本篇文章将带来MVS的传统方法PatchMatch Stereo和源码实践。
计算机视觉
2021/03/16
7290
WPF 使用 HandyControl 给 ListView 添加漂亮的表头效果
本文将来安利大家一个很好用的 UI 控件库,著名的 HandyControl 库。在想要给 ListView 添加一个表头,同时想要这个 ListView 在没有美工小姐姐的帮助下也能看起来比较好看,此时就特别适合使用 HandyControl 库
林德熙
2020/07/28
3.9K0
WPF 使用 HandyControl 给 ListView 添加漂亮的表头效果
多视图机器学习的宏观发展趋势
多视图学习也称为多视角学习(Multi-view Learning),其研究主旨在于如何通过对视图间相互关系的建模与发掘,建立视图间的正则化约束或概率依赖关系,最终增强学习系统的性能。
一点人工一点智能
2023/02/03
1.5K0
传统多视图立体算法:PatchMatchStereo详解
多视图立体技术是一种从已知相机内外参数的多个视角的彩色影像中,利用立体匹配算法恢复立体结构的三维视觉技术。本篇文章将带来MVS的传统方法PatchMatch Stereo和源码实践。
3D视觉工坊
2021/03/19
1.1K0
传统多视图立体算法:PatchMatchStereo详解

相似问题

ObservableCollection刷新视图多虚拟机

118

WPF-列表框-多绑定Howto

10

ObservableCollection不修改视图

21

WPF ObservableCollection列表视图

11

ObservableCollection未更新视图

30
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档