在类python之外发出调用方法

时间:2016-09-04 11:02:36

标签: python list python-2.7 class methods

我正在开发一个python assingment,涉及使用多种方法创建和使用类。我不会发布整个事情,因为如果我代表我正在尝试做的事情,那么指出我的问题会更简单。

fruit_choice = int(raw_input("What fruit would you like?"))
Fruit.return_list(fruit_choice)

所以上面的代码可行。我的问题是让return_list在课外使用时能够正常工作,如下所示:

Fruit.return_list(fruit_choice)
TypeError: unbound method return_list() must be called with Fruit instance as first argument (got int instance instead)

基本上我正在尝试创建一个方法,在调用时,在列表中的索引处输出项目,索引由用户输入指定(即fruit_choice = 0,打印项目是列表的第一个元素。)

我对类有基本的了解,但是像return_list那样使用一种模糊的方法工作有点不直观。我收到的错误消息:

func getPath(fileName: String) -> String {

        let documentsURL = NSFileManager.defaultManager().URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask)[0]
        let fileURL = documentsURL.URLByAppendingPathComponent(fileName)


         print("File Path Is : \(fileURL)")

        return fileURL.path!
    }

 func copyFile(fileName: NSString , filePath : NSString) {
        let dPath: String = getPath(fileName as String)
        let fileManager = NSFileManager.defaultManager()
        if !fileManager.fileExistsAtPath(dPath) {



            let fromPath : NSURL = NSURL.fileURLWithPath(filePath);            
            var error : NSError?
            do {
                try fileManager.copyItemAtPath(fromPath.path!, toPath: dPath)
            } catch let error1 as NSError {
                error = error1
            }
            let alert: UIAlertView = UIAlertView()
            if (error != nil) {
                alert.title = "Error Occured"
                alert.message = error?.localizedDescription
            } else {
                alert.title = "Successfully Copy"
                alert.message = "Your File copy successfully"
            }
            alert.delegate = nil
            alert.addButtonWithTitle("Ok")
            alert.show()
        }
    }

我知道如果我让代码工作,如果输入为0而不是“red”,“apple”,则输出将为“红色”,但这是另一个时间的问题。

如果有人能够指出我在创建/调用return_list方法时遇到了什么问题,那么请谢谢。

3 个答案:

答案 0 :(得分:1)

基本上,您正在调用没有实例的实例方法,这就是您收到此错误的原因

    TypeError: unbound method return_list() must be called with Fruit instance as first argument (got int instance instead)

更正后的代码

    fruit_1.return_list(fruit_choice)

您正在做的是静态方法的行为,它们在没有实例的情况下被调用。 请仔细阅读一些oops编程,如python中的实例方法和静态方法。

希望有所帮助:)

答案 1 :(得分:0)

您似乎对类和类实例存在误解。

您定义的return_list函数是Fruit类的一部分,即Fruit类的每个实例都包含此方法。但是使用这个函数,即从水果列表中返回一个特定的水果,与单个Fruit个实例无关,这意味着这个方法不应该首先在Fruit类中。

类定义class Fruit(self,color,name)的签名是错误的。它应该是class Fruit:。应将初始参数定义为__init__方法的参数。

列表fruit_list应包含Fruit个实例。该计划可以写成:

class Fruit:
    def __init__(self, color, name):
        self.color = color
        self.name = name

    def __str__(self):
        return 'I am a ' + self.color + ' ' + self.name

fruit_list = []

fruit_1 = Fruit("red", "apple")
fruit_list.append(fruit_1)

fruit_choice = int(raw_input("What fruit would you like?"))
print(fruit_list[fruit_choice])

打印Python对象会调用__str__魔术方法。

如果你真的想要一个单独的函数从Fruit返回fruit_list,你可以在类外定义一个函数(但是当你可以直接访问实例时,这些似乎是不必要的索引):

def return_list(list, index):
    return list[index]

def return_list(index):
    global fruit_list
    return fruit_list[index]

如果您尝试使用print(fruit_list)打印整个列表,则输出为:

[<__main__.Fruit instance at 0x110091cf8>]

这是因为当您打印实例列表时,Python不会在每个实例上调用__str__。您可以执行以下操作打印fruit_list

for fruit in fruit_list:
    print(fruit)

答案 2 :(得分:0)

以下是您问题的可能解决方案:

class Fruit():

    def __init__(self, color, name):
        self.color = color
        self.name = name

    def __str__(self):
        return "Color: {0} Name: {1}".format(self.color, self.name)


class FruitBasket():

    def __init__(self):
        self.fruits = []

    def get_fruit(self, index):
        try:
            value = self.fruits[index]
            return value
        except Exception as e:
            print "Error with index {0} -> {1}".format(index, e)

if __name__ == "__main__":
    basket = FruitBasket()
    names = ["apple", "orange", "lemon"]
    colors = ["green", "orange", "yellow"]

    for name, color in zip(names, colors):
        fruit = Fruit(color, name)
        basket.fruits.append(fruit)

    print basket.get_fruit(0)
    print basket.get_fruit(1)
    print basket.get_fruit(2)
    basket.get_fruit(3)

关于上述代码的评论很少:

  • 水果对象没有比设置具有特定名称和水果的水果更多的责任感。颜色,这几乎是。一个水果不应该包含任何水果列表,这应该是另一个对象的责任
  • FruitBasket是水果的容器,你可以完美地做到这一点而不使用OOP但是为了这个问题,这是一个有效的选择,可以容纳许多水果

关于你的错误,其他答案和评论已经指出了什么是错的。另外,关于class Fruit(self,color,name):,不要这样做,在那句话中你要声明类类型,而不是构造函数。

我强烈建议您尝试关注其中的一些OOP python tutorials