我正在开发一个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方法时遇到了什么问题,那么请谢谢。
答案 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)
关于上述代码的评论很少:
关于你的错误,其他答案和评论已经指出了什么是错的。另外,关于class Fruit(self,color,name):
,不要这样做,在那句话中你要声明类类型,而不是构造函数。
我强烈建议您尝试关注其中的一些OOP python tutorials。