Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python导入的类作为实例化对象传递_Python - Fatal编程技术网

Python导入的类作为实例化对象传递

Python导入的类作为实例化对象传递,python,Python,我有以下课程: 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 L

我有以下课程:

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 2.7.9(默认,2015年2月10日03:28:08)
[GCC 4.2.1达尔文兼容苹果LLVM 6.0(clang-600.0.56)]
有关详细信息,请键入“帮助”、“版权”、“信用证”或“许可证”。
>>>从classes.helper导入帮助程序
>>>h=助手()
>>>h.uJSONEncode({“Asd”:“Asd”})
\u'{“Asd”:“Asd”}

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

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

class Helper:
    @staticmethod
    def uJSONEncode(dict):
        print(type(_))
        return json.dumps(dict).decode('unicode-escape')
然后这样称呼它:

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

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


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

def uJSONEncode(self, dct):

在Python2中,您应该从
对象
派生类,这样它们才是真正的对象,否则您会得到一个老式的类,这有一些限制。例如

class Helper(object):
在Python3中,类自动继承自
对象
,因此您可以使用问题中使用的语法,但是仍然建议使用显式
对象
语法

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

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"}

编写函数并不需要类。只要这样做:

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

然后,您可以导入包含此函数的模块并将其正常使用。将其包装在类中没有任何用途,除非类实际要执行某些操作(如存储持久状态)。

如果您不需要将其作为方法,那么为什么要创建不包含任何状态的类?我使用类是因为我不想污染全局范围。那么,在这种情况下如何命名函数呢?将函数放在模块的命名空间中并没有污染它,而是在使用它。请参阅。
from classes import helper
def uJSONEncode(mydict):
    return json.dumps(mydict).decode('unicode-escape')