Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >从其他实例属性派生的实例属性

从其他实例属性派生的实例属性
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

复制
相关文章
计数与组合
加法原理:集合元素可以被划分为集合族F = {S1, S2, S3…}则S的元素个数是这些元素个数之和:|S| = |S1| + |S2| + |S3|+…|Sn|
From Zero
2021/12/07
5900
微服务网关与用户身份识别,服务提供者之间的会话共享关系
一套分布式微服务集群可能会运行几个或者几十个网关(gateway),以及几十个甚至几百个Provider微服务提供者。如果集群的节点规模较小,那么在会话共享关系上,同一个用户在所有的网关和微服务提供者之间共享同一个分布式Session是可行的,如图6-8所示。
愿天堂没有BUG
2022/10/28
7490
微服务网关与用户身份识别,服务提供者之间的会话共享关系
[PHP] PHP7以上版本的引用计数不同的困惑
按正常理解php的变量是引用计数,第一次创建变量refcount会是0,当把这个变量赋给新的变量时,refcount会加1
唯一Chat
2020/03/19
4420
Web应用的会话、认证与安全
HTTP协议最初是匿名的、无状态的,一次请求和响应一旦结束,客户端和服务端的连接就会关闭,服务器没有信息可以用来判断哪个用户发送的请求,也无法跟踪用户会话。
搬砖俱乐部
2019/06/15
1.5K0
Scope AR将为Holoens提供远程视频会话技术支持
12月13日,Scope AR为微软的Holoens头显推出了一套AR视频解决方案Remote AR。这家旧金山的公司带来的企业级AR解决方案,能够实现跨平台在线视频通话。 用于微软 HoloLens
VRPinea
2018/05/17
7530
vissE--提供不同的基因集富集分析方法!
通常,基因集富集分析的结果(例如使用 limma::fry、singscore 或 GSEA)由一长串基因集组成。然后生物学家必须搜索这些列表,以确定新出现的主题来解释改变的生物过程。这项任务可能是劳动密集型的,因此需要解决方案来总结来自此类分析的大量结果
作图丫
2022/03/29
5510
vissE--提供不同的基因集富集分析方法!
Salesforce Connect:为客户成功提供连接的应用程序
Salesforce connect是一个新的应用允许Salesforce用户访问和管理外部应用,无论是传统还是云端的应用,都可直接通过Salesforce来访问。通过Salesforce connect,你的业务能够更高效和灵活,并能提供更高级别的客户成功。
臭豆腐
2019/04/16
1.5K0
Android官方提供的支持不同屏幕大小的全部方法
为了确保你的布局能够自适应各种不同屏幕大小,你应该在布局的视图中使用"wrap_content"和"match_parent"来确定它的宽和高。如果你使用了"wrap_content",相应视图的宽和高就会被设定成刚好能够包含视图中内容的最小值。而如果你使用了"match_parent"(在Android API 8之前叫作"fill_parent"),就会让视图的宽和高延伸至充满整个父布局。
黄啊码
2020/05/29
1.7K0
会话控制 COOKIE 与 SESSION
会话控制 用来保持用户的状态 具体来说cookie机制采用的是在客户端保持状态的方案,而session机制采用的是在服务器端保持状态的方案
星哥玩云
2022/09/14
3810
LeetCode 1930. 长度为 3 的不同回文子序列(计数)
子序列 是由原字符串删除其中部分字符(也可以不删除)且不改变剩余字符之间相对顺序形成的一个新字符串。
Michael阿明
2021/09/06
9790
LeetCode 1481. 不同整数的最少数目(计数+排序+贪心)
给你一个整数数组 arr 和一个整数 k 。现需要从数组中恰好移除 k 个元素,请找出移除后数组中不同整数的最少数目。
Michael阿明
2020/07/13
5520
如何在Flutter应用程序中创建不同的渐变[Flutter专题20]
Flutter 可用于创建漂亮的 UI。因此,在今天的文章中,我们将看到如何在应用程序中创建不同的渐变 。
徐建国
2021/12/22
4.9K0
如何在Flutter应用程序中创建不同的渐变[Flutter专题20]
云计算提供商的网络性能有哪些不同
每个云计算提供商的网络连接方式各不相同,这会导致网络性能和可预测性方面的地理差异。随着越来越多的企业考虑将业务迁移到云平台,尤其是软件定义广域网(SD-WAN)和多云,了解每个公共云服务提供商提供的服务以及如何进行比较至关重要。
静一
2020/03/15
1.4K0
针对会话机制的攻击与防御
学习打卡计划是信安之路知识星球开启的 “每天读书一小时,挑战打卡一百天” 主题活动,能够坚持学习打卡 100 天的同学可以获得信安之路提供的百分成就徽章和证书,学习书籍可以自选,主要目的是养成每日读书学习的好习惯,并将自己的学习心得分享出来供大家学习。
信安之路
2020/12/24
6220
15-会话技术与Cookie
一次会话中包含多次请求和相应,浏览器第一次给服务器资源发送请求,会话建立,直到有一方断开为止,会话结束
Ywrby
2022/10/27
4280
15-会话技术与Cookie
「小程序JAVA实战」java-sesion的状态会话与无状态会话(38)
我相信大家在参与web开发的时候,肯定会遇到session,其实在平常的开发过程中,用到的session都是有状态的session。 有状态的session 正常的web开发,每次来一个用户就会产生一
IT架构圈
2019/07/08
5350
「小程序JAVA实战」java-sesion的状态会话与无状态会话(38)
TCP会话劫持原理与测试
由于 TCP 协议并没有对 TCP 的传输包进行验证,所以在我们知道一个 TCP 连接中的 seq 和 ack 的信息后就可以很容易的伪造传输包,假装任意一方与另一方进行通信,我们将这一过程称为 TCP 会话劫持(TCP Session Hijacking)
信安之路
2018/08/08
4.4K0
TCP会话劫持原理与测试
什么是域名?如何利用域名解析提供不同的服务?
在日常的IT服务工作中,还是有相当一部分的客户,不明白域名的概念、域名的重要性以及域名能为企业带来什么样的便利,那么笔者就以本文来解释一下,什么是域名?以及域名在实际工作中的妙用。
IT狂人日志
2022/05/18
4.6K0
什么是域名?如何利用域名解析提供不同的服务?
点击加载更多

相似问题

与分组不同的计数

13

与组不同计数

32

不同用户会话的相似记录计数

10

CountVectorizer给出的计数与手工计数不同

14

粘性会话与基于cookie的会话不同吗?

213
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

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

洞察 腾讯核心技术

剖析业界实践案例

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