如何告诉类方法应该处理哪个变量

时间:2018-07-06 14:47:05

标签: python

很抱歉出现菜鸟问题。可以说我有一个包含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))

2 个答案:

答案 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的逻辑选择要查看的组件。