Python 我应该从类内部创建类实例吗?
我有一个类,可以选择将串行端口作为参数。我想创建一个枚举函数,它将返回一个MyClass对象数组,所有对象都具有唯一的端口。但是我很不确定这个枚举函数应该放在哪里。如果我像这样把它放在课堂上,感觉会更好一些: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
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
,我认为返回生成器更合适