【问题标题】:Python imported class being passed as instantiated objectPython 导入的类作为实例化对象传递
【发布时间】:2015-12-24 15:26:56
【问题描述】:

我有以下课程:

classes/helper.py

import json

class Helper:
    def uJSONEncode(_, dict):
        print(type(_))
        return json.dumps(dict).decode('unicode-escape')

我将类实例化如下:

Python 2.7.9 (default, Feb 10 2015, 03:28:08)
[GCC 4.2.1 Compatible Apple LLVM 6.0 (clang-600.0.56)] on darwin 
Type "help", "copyright", "credits" or "license" for more    information.
>>> from classes.helper import Helper
>>> h = Helper()
>>> h.uJSONEncode({"Asd": "asd"})
<type 'instance'>
\u'{"Asd": "asd"}'

为什么 python 将实例化对象作为第一个参数传递(我假设是)?我将如何避免这种行为?

【问题讨论】:

  • 如果您不需要它作为方法,那么don't make it a method
  • 如果类不保存任何状态,你为什么要创建它?
  • 我使用了一个类,因为我不想污染全局范围。那么在这种情况下我该如何命名函数呢?
  • 将函数放在模块的命名空间中并没有污染它,而是在使用它。见this question
  • from classes import helper

标签: python


【解决方案1】:

你可能想创建一个静态方法:

class Helper:
    @staticmethod
    def uJSONEncode(dict):
        print(type(_))
        return json.dumps(dict).decode('unicode-escape')

然后这样称呼它:

Helper.uJSONEncode({"Asd": "asd"})  

【讨论】:

    【解决方案2】:

    正如其他人提到的那样,您可能不需要在这里需要一个类:只需将该函数作为独立函数放入您的模块中即可。与其他一些语言(例如 Java)不同,Python 不会强迫您将事物包装到类中。即使你有几个相关的函数,你也可能不需要一个类,除非这些函数需要共享状态。简单地将相关功能放在一个模块中就足够了。


    在 Python 中,普通类方法接收实例作为第一个参数。对于该参数使用self 是正常的,因此您可以编写类似

    的方法签名
    def uJSONEncode(self, dct):
    


    在 Python 2 中,您应该从 object 派生您的类,以便它们是 new-style classes,否则您会得到一个旧式类,它有一些限制。例如,

    class Helper(object):
    

    在 Python 3 中,类自动继承自 object,因此您可以使用您在问题中使用的语法,但仍建议使用显式 object 语法。

    在这里使用新样式类的一个小好处是实例类型(即它的类)的默认表示形式更多信息:

    import json
    
    class Helper(object):
        def uJSONEncode(self, dct):
            print(type(self))
            return json.dumps(dct).decode('unicode-escape')
    
    h = Helper()
    print(h.uJSONEncode({"Asd": "asd"}))
    

    输出

    <class '__main__.Helper'>
    {"Asd": "asd"}
    


    顺便说一句,不要使用 dict 作为变量名,因为这会影响内置的 dict 类型,这可能会导致神秘和烦人的错误。 liststrintfloatset 等也是如此。


    最后,_ 在交互式解释器中具有特殊含义:它是最后一个结果。演示:

    >>> 3+7
    10
    >>> _
    10
    

    【讨论】:

      【解决方案3】:

      你不需要一个类来写一个函数。只需这样做:

      def uJSONEncode(mydict):
          return json.dumps(mydict).decode('unicode-escape')
      

      然后您可以导入包含此功能的模块并正常使用它。将其包装在一个类中没有任何意义,除非该类要实际做某事(例如存储持久状态)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-10-24
        • 2022-06-23
        • 1970-01-01
        • 2013-12-17
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多