为了账号安全,请及时绑定邮箱和手机立即绑定

当一个属性依赖于2个类时,应该在哪个类上定义它?

当一个属性依赖于2个类时,应该在哪个类上定义它?

有只小跳蛙 2023-07-27 14:21:34
假设我有 2 个课程:Water和Substance。一个或多个Substances 可以溶解在Water; 实例Water具有substances包含实例列表的属性Substance。a 的扩散常数Substance取决于Water它所溶解的 a 的属性以及 aSubstance本身的某些属性。然后我应该创建一个get_diffusion_constant方法并将Water其实例Substance作为其属性,还是应该将该方法添加到其参数的位置Substance?Water或者有完全不同的方法吗?
查看完整描述

2 回答

?
RISEBY

TA贡献1856条经验 获得超5个赞

你写了:


a 的扩散常数Substance取决于Water


这让我们认为扩散常数是物质的特征,因此该类Substance应该拥有允许计算它的方法(使用参数来提供实例,Water因为它依赖于它)。


这对于大多数简单的情况都很有效,如果一个真正的概念拥有一个特征,那么它的模型(在这种情况下是一个类)应该拥有相关的属性或方法。


一些设计模式和/或更复杂的需求可能有理由打破这个“规则”以引入更多吸引力。


self另外,回答你的评论:传递给函数 不是问题(至少在我看来) 。self只是对当前实例的引用,没有什么特别的,只是它是命名当前实例的广泛尊重的约定,因此也是(实例)方法的第一个参数。


进一步解释一下:实例方法必须接受对相关实例的引用作为第一个参数。按照惯例,这个位置参数被命名为self,但您可以决定将其命名为this,instance或者无论您想要什么,它都是一样的。然后您只需在方法中使用正确的参数名称即可。


请参阅下面的代码。它为实例参数使用了非常糟糕的名称,但它的工作原理就好像self已经被使用过一样:


class Foo:

    def __init__(current_instance):

        current_instance.bar = 'baz'


    def __str__(this_name_is_ridiculous):

        return this_name_is_ridiculous.bar



print(Foo())  # prints baz


查看完整回答
反对 回复 2023-07-27
?
阿波罗的战车

TA贡献1862条经验 获得超6个赞

我认为Water继承了一些东西Substance。那么你可以diffusion_constant在每个中都有一个Substance,也可以有一个diffuse带有一个或多个Substances 的函数


编辑:


class Water:

     def diffuse(self, *args):

         #check if args is greater 0 or None and then iterate and apply diffusion_constants


class Substance:

      diffusion_constant = 0 #base constant


class Sirup(Substance):

      diffusion_constant = 3


#somewhere later then

corn_sirup = Sirup()

sugary_sirup = Sirup()

water = Water()

water.diffuse(corn_sirup, sugary_sirup)

编辑:由于评论,我更改了代码。Python 具有鸭子类型,因此只要您的物质具有diffusion_constant属性,就可以访问它,无论它是什么。然后应该这样做


查看完整回答
反对 回复 2023-07-27
  • 2 回答
  • 0 关注
  • 98 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信