【问题标题】:Using method variable inheritance in a class在类中使用方法变量继承
【发布时间】:2019-12-15 04:33:26
【问题描述】:

我试图理解为什么在处理数据操作时我们会在 Python 中使用类而不是函数。我不明白一个类如何帮助我处理数据操作管道。

我想用下面的虚拟代码来说明。

Class foo():

   def one(self):
   ''' loads data and does something meaningful'''
   self.x = 'eee'
   return self.x

   def two(self):
   '''adds to meaningful data'''
   self.y = self.x + 'fff'
   return self.y

   def three(self):
   '''third process in data pipeline'''
   self.z = self.y + 'ggg'
   return self.z

要使用第三种方法three(),我必须调用所有其他方法,否则我在two()one() 中设置的实例变量未设置。

instance = foo()
instance.one()
instance.two()
var = instance.three()
print(var)
>>> 'eeefffggg'

还有其他方法可以让我的第三个方法three() 使用前两个中设置的变量吗?为什么这比我只需要一行的函数式编程(见下文)更有用?我是否应该以与下面相同的方式在我的类中调用方法one()two()

def one():
   return 'eee'

def two():
   x = one()
   return x + 'fff'

def three()
   x = two()
   return x + 'ggg'
print(three())
>>> 'eeefffggg'

如何在一个类中构建数据操作管道,我只需调用一个方法three(),它会自动调用其他两种方法,如果我愿意,我可以随时检查步骤并查看方法的输出一和二通过打电话给他们?这没有用吗,我是不是想错了?

【问题讨论】:

  • __init__ 中做一个和两个的工作怎么样? docs.python.org/3.7/tutorial/classes.html#class-objects
  • 为什么不从three 方法调用self.two(),就像从three 函数调用two() 一样?但是这里的课程似乎没有任何意义。
  • 除非您想将数据从一个函数隐式传递到另一个函数(通过类实例),否则函数组合在这里比 OOP 更重要。
  • 这个类对OO代码的使用不好。有些问题非常适合 OO 代码,但并非所有问题都需要 OO 代码。所以......是的......如果你不需要它,不要。
  • 也许组织你的代码,以便它现在和五年后对你有意义。如果您使用该类进行组合,则可以使用模块代替,这是 Python 代码的公认做法。

标签: python class variables methods instance


【解决方案1】:

我试图理解为什么在处理数据操作时我们会在 Python 中使用类而不是函数。我不明白一个类如何帮助我处理数据操作管道。

简短的回答:这不是课程的用途。当您需要螺丝刀时,您不会使用扳手,即使在技术上可能这样做 - 这里的原理类似。


类适用于面向对象的编程。具有具有特定行为集的特定类型的对象很有用。拥有一个特定的超类型对象和许多共享相同接口但不同实现的子类型也很有用,因为它们具有可变功能,而无需编写更多代码并覆盖边缘情况。面向对象设计的三个“支柱”是封装、继承和多态,虽然 python 在封装方面的成功是有争议的(通过设计),但它确实提供了后两者。

如果您不需要这些,那么课程就不是适合您工作的工具。如果您尝试进行功能性编码,仅依赖输入和输出而不需要在两者之间保存持久状态,那么类不是您工作的正确工具。也许它们在那里很有用,但是如果你可以只用函数做你想做的事,那么只用函数就可以了。

【讨论】:

  • 我会用“封装失败”部分来狡辩。 “封装”并不意味着您必须不可能让其他代码访问内部。这意味着有一个与其他代码交互的公共接口与类可能在内部使用的任何逻辑分开。只要这种分离是明确的,Python 使用_,并且代码不访问“仅供内部使用”的代码,封装就可以了。如果您这样选择,内部结构是可选的,这一事实并不意味着有 no 封装。
猜你喜欢
  • 1970-01-01
  • 2019-10-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-09
  • 2016-11-19
  • 2015-12-09
相关资源
最近更新 更多