猿问

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

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



有只小跳蛙
浏览 99回答 2
2回答

RISEBY

你写了: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.barprint(Foo())  # prints baz

阿波罗的战车

我认为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_constantsclass Substance:      diffusion_constant = 0 #base constantclass Sirup(Substance):      diffusion_constant = 3#somewhere later thencorn_sirup = Sirup()sugary_sirup = Sirup()water = Water()water.diffuse(corn_sirup, sugary_sirup)编辑:由于评论,我更改了代码。Python 具有鸭子类型,因此只要您的物质具有diffusion_constant属性,就可以访问它,无论它是什么。然后应该这样做
随时随地看视频慕课网APP

相关分类

Python
我要回答