有什么理由将导入库作为类属性?

时间:2019-01-03 21:10:14

标签: python class

我是否应该将datetime设为班级归因,这是我做出决定的主要原因?可以说我是否知道class Test2是单一类,并且绝对没有计划被任何类继承

在没有将任何Test2设置为类属性或类的情况下,用作类import是否正确?

test1.py

import datetime

class Test1:
    datetime = datetime
    def getnow(self):
        return self.datetime.time()

test2.py

import datetime

datetime = datetime
class Test2:
    def getnow(self):
        return datetime.time()

2 个答案:

答案 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样式指南都鼓励程序员将所有导入内容放置在模块文件的开头。”