我是否应该将datetime
设为班级归因,这是我做出决定的主要原因?可以说我是否知道class Test2
是单一类,并且绝对没有计划被任何类继承
在没有将任何Test2
设置为类属性或类的情况下,用作类import
是否正确?
import datetime
class Test1:
datetime = datetime
def getnow(self):
return self.datetime.time()
import datetime
datetime = datetime
class Test2:
def getnow(self):
return datetime.time()
答案 0 :(得分:1)
这两种实现方式都没有任何真正的好处。
在test2.py中,datetime = datetime
本质上是无操作的。它不会更改模块的状态。这是完全没有用的。
test1.py实际上也没有什么特别的区别。它只是将datetime
设置为类属性,这意味着它会在类中查找datetime
而不是模块。 可能在某些非常重的环境下表现更好,但除非您已经知道自己在做什么,否则还不足以使您担心。
尽管他们援引self.datetime.time()
的事实向我表明,作者的假设(假设您看到有人用自己的代码这样做)是datetime
可以暂时替换在运行时,像这样:
class FakeDatetime:
def time(self):
return 'from fake datetime'
t = Test1()
t.datetime = FakeDatetime()
print(t.getnow()) # Prints "from fake datetime"
对我来说,这似乎是一种错误的尝试,试图使用 mock 或 stub 进行自动化测试。他们可能打算将其用于这样的用途:
import unittest
from test1 import Test1
class TestStringMethods(unittest.TestCase):
def test_my_method():
mock = MyMock()
expected_value = 'my value'
# Set up code to make mock.time() return expected value
t = Test1()
t.datetime = mock
assert t.time() == expected_value
在Python中进行模拟的标准解决方案是unittest.mock
module(如果使用Python 3.2或更早版本,则为mock
package)。此模块鼓励修补代替依赖项,而不是像您提供的代码这样的手册:
test3.py
import datetime
class Test3:
def getnow(self):
return datetime.time()
test3tests.py
import unittest
from unittest import mock
from test3 import Test3
class TestStringMethods(unittest.TestCase):
@mock.patch('test3.datetime')
def test_my_method(datetime_mock):
expected_value = 'my value'
datetime_mock.time.return_value = expected_value
t = Test3()
assert t.time() == expected_value
# Original datetime is restored by patch automatically when method exits
答案 1 :(得分:0)
基于这个主题,您的意思是什么?
此
import datetime
class Test1:
datetime = datetime
def getnow(self):
return self.datetime.time()
与这个
class Test2:
import datetime
datetime = datetime
def getnow(self):
return self.datetime.time()
看来您的导入应该在python文件的顶部。因此,在这种情况下,Test1是正确的方法。
In Python, what happens when you import inside of a function?
“通常,这样做可能没有太大好处。事实上,大多数Python样式指南都鼓励程序员将所有导入内容放置在模块文件的开头。”