很抱歉出现菜鸟问题。可以说我有一个包含3个列表的类和一个将其中一个列表组合为字符串的方法。我如何告诉该方法应采用哪个列表?还是应该将方法从类中移到函数中?
这是我的意思:
class images():
def __init__(self, lista, listb, listc):
self.lista=lista
self.listb=listb
self.listc=listc
def makelist(self):
items = ""
for item in self.whateverListIWant:
items=items+item
return items
test=images([1,2,3],["b"],["c"])
print (test.makelist(WhichListIWant))
答案 0 :(得分:2)
您可以做到
class images():
def __init__(self, lista, listb, listc):
self.lista=lista
self.listb=listb
self.listc=listc
def makelist(self, param):
items = ""
for item in param:
items= items + str(item)
return items
test=images([1,2,3],["b"],["c"])
print (test.makelist(test.lista))
答案 1 :(得分:0)
请注意,示例中没有“类方法”(由装饰器@classmethod指示)。 Yours是对创建的对象起作用的标准对象方法,突出显示为使用“ self”作为第一个参数。
对象方法作用于对象,并且可以引用自身中包含的数据。 “类方法”只能作用于一个类,并且只能使用该类可用的参数。
使用类方法将是这样的:
class ClassyImages():
lista = []
listb = []
listc = []
@classmethod
def makelist(cls, which):
if which == 'a':
the_list = cls.lista
elif which == 'b':
the_list = cls.listb
elif which == 'c':
the_list = cls.listc
else:
raise ValueError("Invalid value " + str(which))
return the_list[:] # returns a soft copy of the list
您将按以下方式使用它:
ClassyImages.lista.extend([1,2,3])
ClassyImages.listb.add("b")
ClassyImages.listc.add("c")
print(ClassyImages.makelist("a"))
看到区别了吗?在您的示例中,您在创建的对象实例上使用方法。在这种情况下,我们只使用类级别的变量,而不使用对象的实例。
但是,@classmethod
装饰器的一个不错的功能是您仍然可以在对象上使用class方法。因此,您也可以这样做:
my_classy_object_1 = ClassyImages()
my_classy_object_2 = ClassyImages()
print(my_classy_object_1.makelist("b")) # prints: ['b']
ClassyImages.listb.add("bb")
print(my_classy_object_1.makelist("b")) # prints: ['b', 'bb']
print(my_classy_object_2.makelist("b")) # prints: ['b', 'bb']
我的回答掩盖了您可能真正要问的问题-如何告诉它要查看的列表。您可以按照sjaymj64的建议将列表注入参数中。或者,您可以将字符串或数字传递到函数中,类似于我对类级makelist所做的操作。这完全取决于您-提供看起来最合适,最方便的方式,让Makelist的逻辑选择要查看的组件。