如果它只能有一个实例,我还应该创建一个类吗?

时间:2013-04-04 17:10:39

标签: python oop

我是OOP的新手,正在编写一个Python小工具,使用来自网络Bitcoin() class的JSON负载检查比特币价格,监控价格Monitor(),在达到阈值时通知用户Notify()并且现在使用控制台界面Interface()来执行此操作。

我创建了一个Bitcoin()类,可以从JSON加载中读取价格和数量。 __init__定义使用套接字连接到Web。由于这个类的每个实例都会产生一个新的套接字,我只需要/想要运行这个类的一个实例。

  1. 课程仍然是解决这个问题的最好方法吗?
  2. 让其他类和实例与我的Bitcoin()实例进行交互的最佳方法是什么?
  3. 我应该全局Bitcoin()个实例吗?将实例作为参数传递给需要它的每个类?

6 个答案:

答案 0 :(得分:2)

首先关注我的是SRP违规行为,您的Bitcoin课程可能不应该对此负责:

  • 打开插座,
  • 解析结果,
  • 渲染输出。

我不知道细节,但从我的观点来看,你应该将该功能拆分为较小的类/功能(如果只使用模块),其中一个将负责从网络检索数据。还请记住,全球国家是邪恶的(在某些情况下,单身人士可以被描述为全球国家)。

从我的观点来看,另一件事就是在构造函数中打开一个套接字。这是不可测试的,当然你可以模拟/存根套接字,但从我的观点来看,当类需要它的所有依赖项作为构造函数参数时它会更好。通过这样做你也可以注意到一些具有广泛责任的类(如果你的构造函数需要更多的3,4参数,它肯定可以简化)。

答案 1 :(得分:1)

http://www.youtube.com/watch?v=o9pEzgHorH0

我不确定这个视频对你的项目有多相关(没有实际阅读的代码)。但也许你会找到问题的答案。至少你会学到一些新的东西,而这正是这里的。

答案 2 :(得分:1)

如果我是你,我的代码会是这样的:
(每组工作的一个班级,这不是你在做什么)

class Interface:
    ''' Handle UI '''
    ...

class Connect:
    ''' Handle web interface '''
    ...

class Bitcoin:
    ''' Handle the calculations '''
    ...

class Notify:
    ''' Notifier '''
    ...

简而言之,将您的班级拆分为更简单的小类

现在提问:

  1. 是的,因为你手头有一个“复杂问题”并且你正在使用Python,所以创建OOP版本肯定比非OOP版本更容易。所以,除非你有充分的理由不坚持,坚持OOP。
  2. 在您的情况下,它也可以将实例作为参数传递。
  3. 这是一个好主意。如果您对它们没有很好的理解,这可以消除范围引起的问题 但请记住,传递引用而不是值,因此操纵实例会影响实例传递给的其他类。
  4.   

    注意:在类的构造函数中打开套接字不是一个好主意。如果你在方法中使用它可能会更好。

答案 3 :(得分:0)

答案可能是。取决于你整个建筑, 你应该看一下单身模式,因为你的描述会让Allton全面吼叫。

http://de.wikipedia.org/wiki/Singleton_%28Entwurfsmuster%29

如果你没有找到任何反对在给定架构中创建课程的正当理由,那就去吧。

答案 4 :(得分:0)

OOP是一种工具,不是目标,您可以决定是否使用它。如果您使用Python模块,则无需编写“class”即可实现封装。

答案 5 :(得分:0)

当然,您可以使用python类来实现此目的。您也可以使用模块级实例(不需要全局关键字或显式传递作为参数)。这是一个品味恕我直言。

基本上你问的是关于Singleton模式特定于python的实现,它已在这里得到解答: Python and the Singleton Pattern

模式描述本身可以在这里找到:http://en.wikipedia.org/wiki/Singleton_pattern