python – 在类层次结构中应该编写实例方法?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了python – 在类层次结构中应该编写实例方法?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2456字,纯文字阅读大概需要4分钟。
内容图文
![python – 在类层次结构中应该编写实例方法?](/upload/InfoBanner/zyjiaocheng/798/ace6c80e84f544f98cf4987ec09bd6b6.jpg)
这是我用于模拟模型的类“层次结构”的一部分(我的代码在Python中,但我认为我的问题不依赖于语言):
class World:
# highest-level class, which "knows" everything about the model
# most likely will have just one instance
# contains (e.g., in a dictionary) references to all the instances of class Agent
class Agent:
# each instance represents an agent
# an agent can, among other things, move around according to certain rules
# movement depends on the internal state of the agent,
# but also on the terrain and other information not stored in the Agent instance
问题:我应该在哪里放置move实例方法?
我认为我应该将类Agent的依赖性限制在层次结构中比自身更低的类(即,其实例包含在代理实例中的类).但这意味着移动方法不能在类Agent中,因为它创建了一个依赖于(至少是描述地形等的类的接口) – 因此我不妨向Agent添加对World的引用(因此依赖于World).从软件设计角度来看,这样可以吗?
另一种方法是将方法移动到类World中,它不会导致任何其他依赖.然而,类World将会做几乎所有的工作,在我看来它会违背OOP的主要思想(我理解为不将所有功能集中到一个地方,而是将其包含在相关的地方)类).
性能方面的考虑只是次要问题(我认为两种方法之间的性能不同).
编辑:我误用了上面的“类层次结构”.我没有提到继承层次结构,只是指一堆实例相互包含的类.
解决方法:
你需要考虑的是Single Responsibility Principle.基本上,每个类应该对一个“事物”负责,并且应该完全包含那个责任.而且你应该只继承责任延伸的地方.你应该始终能够说扩展类是父级的100%以及更多(在特定意义上更多).你永远不应该有这样一种情况:孩子是父母的一个子集并且“少”.因此,扩展世界的人并不是一个好的设计,因为世界上有些方面与人无关.
因此,如果我们查看一个示例,您可以将实例方法放在由该特定类的角色决定的级别上.那么,让我们看一个更明确的例子:
class Person:
name: ""
birthDate: ""
class PoliceOfficer extends Person:
badgeNumber: ""
显然这是伪代码,但它展示了正在发生的事情.
现在,你会在哪里添加move()方法?我们可以将它添加到PoliceOfficer,但是我们会打破Person的封装,因为一个人也可以移动.
class Person:
def move(world):
但是,我们在哪里添加issueTicket()方法?广义人员不能发票,所以如果我们将其添加到Person类,我们就要承担责任.所以相反,我们会把它添加到PoliceOfficer,因为那是有道理的.
至于创建依赖关系,你应该是always favor composition over inheritance.所以在这个意义上,可以有你想要的依赖关系,因为它们都是软依赖关系(好吧,有点).由于move()采用了world(或具有world接口的对象)的实例,因此依赖关系被推出类并进入调用代码.因此,让您的类代码保持相当开放和无依赖性,同时仍然具有生产力.
通常认为硬编码依赖关系是不好的做法.但注入它们(通过依赖注入或组合)通常被认为是一件好事.
总结:将实例方法放在符合逻辑意义的地方.
内容总结
以上是互联网集市为您收集整理的python – 在类层次结构中应该编写实例方法?全部内容,希望文章能够帮你解决python – 在类层次结构中应该编写实例方法?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。