Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/358.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.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_Python 3.x_Class - Fatal编程技术网

Python 我应该从类内部创建类实例吗?

Python 我应该从类内部创建类实例吗?,python,python-3.x,class,Python,Python 3.x,Class,我有一个类,可以选择将串行端口作为参数。我想创建一个枚举函数,它将返回一个MyClass对象数组,所有对象都具有唯一的端口。但是我很不确定这个枚举函数应该放在哪里。如果我像这样把它放在课堂上,感觉会更好一些: class MyClass: def __init__(self, port=None): self.port = port def enumerate(self): ports = list(serial.tools.list_ports

我有一个类,可以选择将串行端口作为参数。我想创建一个枚举函数,它将返回一个MyClass对象数组,所有对象都具有唯一的端口。但是我很不确定这个枚举函数应该放在哪里。如果我像这样把它放在课堂上,感觉会更好一些:

class MyClass:
    def __init__(self, port=None):
        self.port = port

    def enumerate(self):
        ports = list(serial.tools.list_ports.comports())
        a = []
        for p in ports:
            a.append(MyClass(port))
        return a
my_classes = MyClass.enumerate()

但是我很不确定递归地创建这样的类实例是否是一种好的做法。将枚举函数拉出并使其独立于类存在是否更好?

正如@jasonharper在注释中所述,您可以使用
@classmethod

class MyClass(object):
    def __init__(self, port):
        self.port = port

    @classmethod
    def enumerate(cls):
        return (cls(p) for p in serial.tools.list_ports.comports())
你可以这样称呼它:

class MyClass:
    def __init__(self, port=None):
        self.port = port

    def enumerate(self):
        ports = list(serial.tools.list_ports.comports())
        a = []
        for p in ports:
            a.append(MyClass(port))
        return a
my_classes = MyClass.enumerate()

这正是
@classmethod
的目的。将
classmethod
中对
MyClass
的引用替换为
cls
;这就是类方法的全部要点(如果子类构造采用相同的参数,则可在子类中使用,无需修改)。谢谢。我对classmethod不是非常熟悉,在谷歌搜索了一段时间后,我仍然不明白这在功能上与在没有decorator的情况下调用它有什么不同。
cls
self
之间有什么区别?@Indigo:很简单:
cls
MyClass
本身,
self
-
MyClass
实例,比如
MyClass(1337)
当原始代码中有
列表时,您的代码返回
迭代器
snippet@AzatIbrakov考虑到方法名为
enumerate
,我认为返回生成器更合适