有人能帮我在python中传递一个函数作为参数吗?
我有以下python类。我想传递函数get_priority作为参数来访问对象任务。将第二个任务添加到taskManager时,我出现以下错误: if value==数组[int(中间)].acessMethod():AttributeError:Task 实例没有属性“acessMethod” 任务类有人能帮我在python中传递一个函数作为参数吗?,python,function,functional-programming,arguments,Python,Function,Functional Programming,Arguments,我有以下python类。我想传递函数get_priority作为参数来访问对象任务。将第二个任务添加到taskManager时,我出现以下错误: if value==数组[int(中间)].acessMethod():AttributeError:Task 实例没有属性“acessMethod” 任务类 class Task: def __init__(self,id,name,category="",priority=1): self.id = id
class Task:
def __init__(self,id,name,category="",priority=1):
self.id = id
self.name = name
self.category = category
self.priority = priority
self.concluded = False
self.active_days = 0
print("Beggining Class")
def get_name(self):
return self.name
def get_category(self):
return self.category
def get_priority(self):
return self.priority
def set_name(self,name):
self.name = name
def set_category(self,category):
self.category = category
def set_priority(self,priority):
self.priority = priority
def __str__(self):
return str(self.id) + " | " + self.name + " | " + self.category + " | " + str(self.priority) + " | "
TaskManager类
from task import Task
class TaskManager(object):
"""docstring forTaskManager."""
def __init__(self):
print("Initing TaskManager")
self.taskArray = []
"""Adding task ordered by priority"""
"""Maibe adding a check for autheticity of the object """
def addTask(self,task):
if len(self.taskArray) == 0 or self.taskArray[0].get_priority() <= task.get_priority():
self.taskArray.insert(0,task)
else:
index = self.__binarySearchIndex(task.get_priority,self.taskArray,'get_priority')
self.taskArray.insert(index,task)
def __binarySearchIndex(self,value,array,acessMethod):
middle = (len(self.taskArray) / 2) if ((len(self.taskArray) % 2) == 0) else (len(self.taskArray) / 2) + 1
if middle == 1:
middle = 0
if value == array[middle].acessMethod():
return middle
elif value < array[middle].acessMethod():
self.__binarySearchIndex(value,array[:middle])
else:
self.__binarySearchIndex(value,array[middle:])
def __str__(self):
taskString = ""
for task in self.taskArray:
taskString = taskString + str(task) + " \n"
return taskString
从任务导入任务
类TaskManager(对象):
“”“docstring forTaskManager。”“”
定义初始化(自):
打印(“初始化任务管理器”)
self.taskArray=[]
“”“正在添加按优先级排序的任务”“”
“”“可能正在添加对象的身份验证检查”“”
def addTask(自我,任务):
如果len(self.taskArray)==0或self.taskArray[0],则使用getattr从传递的字符串中获取函数
method_to_call = getattr(Task, accessMethod)
if value == array[middle].method_to_call():
使用getattr从传递的字符串中获取函数
method_to_call = getattr(Task, accessMethod)
if value == array[middle].method_to_call():
实际上,我采用了另一种方法,而不是按名称调用该方法,我只是创建一个lambda函数,从Task对象中提取我想要的任何属性
class Task:
def __init__(self,id,name,category="",priority=1):
self.id = id
self.name = name
self.category = category
self.priority = priority
self.concluded = False
self.active_days = 0
print("Beggining Class")
def get_name(self):
return self.name
def get_category(self):
return self.category
def get_priority(self):
return self.priority
def set_name(self,name):
self.name = name
def set_category(self,category):
self.category = category
def set_priority(self,priority):
self.priority = priority
def __str__(self):
return str(self.id) + " | " + self.name + " | " + self.category + " | " + str(self.priority) + " | "
class TaskManager(object):
"""docstring forTaskManager."""
def __init__(self):
print("Initing TaskManager")
self.taskArray = []
"""Adding task ordered by priority"""
"""Maibe adding a check for autheticity of the object """
def addTask(self,task):
if len(self.taskArray) == 0 or self.taskArray[0].get_priority() <= task.get_priority():
self.taskArray.insert(0,task)
else:
index = self.__binarySearchIndex(task.get_priority(),self.taskArray, lambda task: task.get_priority())
self.taskArray.insert(index,task)
def __binarySearchIndex(self,value,array,accessMethod):
if len(array) == 0:
return 0
middle = (len(self.taskArray) / 2) if ((len(self.taskArray) % 2) == 0) else (len(self.taskArray) // 2) + 1
if middle == 1:
middle = 0
if value == accessMethod(array[middle]):
return middle
elif value < accessMethod(array[middle]):
return middle + self.__binarySearchIndex(value,array[:middle],accessMethod)
else:
return middle - self.__binarySearchIndex(value,array[middle:],accessMethod)
def __str__(self):
taskString = ""
for task in self.taskArray:
taskString = taskString + str(task) + " \n"
return taskString
if __name__ == "__main__":
taskA = Task(1, "taskA", priority=2)
taskB = Task(2, "taskB", priority=1)
taskC = Task(3, "taskC", priority=1)
taskD = Task(4, "taskD", priority=3)
manager = TaskManager()
manager.addTask(taskA)
manager.addTask(taskB)
manager.addTask(taskC)
manager.addTask(taskD)
for task in manager.taskArray:
print(task)
类任务:
def _uinit _;(self,id,name,category=”“,priority=1):
self.id=id
self.name=名称
self.category=类别
self.priority=优先级
self.conclused=False
自激活天数=0
印刷品(“乞讨类”)
def get_名称(自身):
返回self.name
def get_类别(自我):
返回自我类别
def get_优先级(自身):
返回自优先权
def set_名称(自身,名称):
self.name=名称
def设置_类别(自身、类别):
self.category=类别
def设置_优先级(自身、优先级):
self.priority=优先级
定义(自我):
返回str(self.id)+“|”+self.name+“|”+self.category+“|”+str(self.priority)+“|”
类TaskManager(对象):
“”“docstring forTaskManager。”“”
定义初始化(自):
打印(“初始化任务管理器”)
self.taskArray=[]
“”“正在添加按优先级排序的任务”“”
“”“可能正在添加对象的身份验证检查”“”
def addTask(自我,任务):
如果len(self.taskArray)==0或self.taskArray[0].get_priority()我实际上采用了另一种方法,而不是按名称调用该方法,我只需创建一个lambda函数,从任务对象中提取我想要的任何属性
class Task:
def __init__(self,id,name,category="",priority=1):
self.id = id
self.name = name
self.category = category
self.priority = priority
self.concluded = False
self.active_days = 0
print("Beggining Class")
def get_name(self):
return self.name
def get_category(self):
return self.category
def get_priority(self):
return self.priority
def set_name(self,name):
self.name = name
def set_category(self,category):
self.category = category
def set_priority(self,priority):
self.priority = priority
def __str__(self):
return str(self.id) + " | " + self.name + " | " + self.category + " | " + str(self.priority) + " | "
class TaskManager(object):
"""docstring forTaskManager."""
def __init__(self):
print("Initing TaskManager")
self.taskArray = []
"""Adding task ordered by priority"""
"""Maibe adding a check for autheticity of the object """
def addTask(self,task):
if len(self.taskArray) == 0 or self.taskArray[0].get_priority() <= task.get_priority():
self.taskArray.insert(0,task)
else:
index = self.__binarySearchIndex(task.get_priority(),self.taskArray, lambda task: task.get_priority())
self.taskArray.insert(index,task)
def __binarySearchIndex(self,value,array,accessMethod):
if len(array) == 0:
return 0
middle = (len(self.taskArray) / 2) if ((len(self.taskArray) % 2) == 0) else (len(self.taskArray) // 2) + 1
if middle == 1:
middle = 0
if value == accessMethod(array[middle]):
return middle
elif value < accessMethod(array[middle]):
return middle + self.__binarySearchIndex(value,array[:middle],accessMethod)
else:
return middle - self.__binarySearchIndex(value,array[middle:],accessMethod)
def __str__(self):
taskString = ""
for task in self.taskArray:
taskString = taskString + str(task) + " \n"
return taskString
if __name__ == "__main__":
taskA = Task(1, "taskA", priority=2)
taskB = Task(2, "taskB", priority=1)
taskC = Task(3, "taskC", priority=1)
taskD = Task(4, "taskD", priority=3)
manager = TaskManager()
manager.addTask(taskA)
manager.addTask(taskB)
manager.addTask(taskC)
manager.addTask(taskD)
for task in manager.taskArray:
print(task)
类任务:
def _uinit _;(self,id,name,category=”“,priority=1):
self.id=id
self.name=名称
self.category=类别
self.priority=优先级
self.conclused=False
自激活天数=0
印刷品(“乞讨类”)
def get_名称(自身):
返回self.name
def get_类别(自我):
返回自我类别
def get_优先级(自身):
返回自优先权
def set_名称(自身,名称):
self.name=名称
def设置_类别(自身、类别):
self.category=类别
def设置_优先级(自身、优先级):
self.priority=优先级
定义(自我):
返回str(self.id)+“|”+self.name+“|”+self.category+“|”+str(self.priority)+“|”
类TaskManager(对象):
“”“docstring forTaskManager。”“”
定义初始化(自):
打印(“初始化任务管理器”)
self.taskArray=[]
“”“正在添加按优先级排序的任务”“”
“”“可能正在添加对象的身份验证检查”“”
def addTask(自我,任务):
如果len(self.taskArray)==0或self.taskArray[0],则get_priority()根本不传递包含名称的字符串。使用methodcaller
函数
例如:
from operator import methodcaller
class TaskManager(object):
def __init__(self):
self.taskArray = []
def addTask(self, task):
if (len(self.taskArray) == 0
or self.taskArray[0].get_priority() <= task.get_priority():
self.taskArray.insert(0,task)
else:
index = self.__binarySearchIndex(
task.get_priority(),
self.taskArray,
methodcaller('get_priority')
)
self.taskArray.insert(index, task)
def __binarySearchIndex(self, value, array, accessMethod):
middle = (len(self.taskArray) / 2) if ((len(self.taskArray) % 2) == 0) else (len(self.taskArray) / 2) + 1
if middle == 1:
middle = 0
if value == accessMethod(array[middle]):
return middle
elif value < accessMethod(array[middle]):
self.__binarySearchIndex(value,array[:middle])
else:
self.__binarySearchIndex(value,array[middle:])
...
然后可以使用attrgetter
而不是methodcaller
from operator import attrgetter
class TaskManager(object):
def __init__(self):
self.taskArray = []
def addTask(self, task):
if (len(self.taskArray) == 0
or self.taskArray[0].get_priority() <= task.get_priority:
self.taskArray.insert(0,task)
else:
index = self.__binarySearchIndex(
task.get_priority,
self.taskArray,
attrgetter('get_priority')
)
self.taskArray.insert(index, task)
def __binarySearchIndex(self, value, array, accessMethod):
middle = (len(self.taskArray) / 2) if ((len(self.taskArray) % 2) == 0) else (len(self.taskArray) / 2) + 1
if middle == 1:
middle = 0
if value == accessMethod(array[middle]):
return middle
elif value < accessMethod(array[middle]):
self.__binarySearchIndex(value,array[:middle])
else:
self.__binarySearchIndex(value,array[middle:])
...
从操作员导入属性
类TaskManager(对象):
定义初始化(自):
self.taskArray=[]
def addTask(自我,任务):
如果(len(self.taskArray)==0
或self.taskArray[0]。get_priority()根本不传递包含名称的字符串。请使用methodcaller
函数
例如:
from operator import methodcaller
class TaskManager(object):
def __init__(self):
self.taskArray = []
def addTask(self, task):
if (len(self.taskArray) == 0
or self.taskArray[0].get_priority() <= task.get_priority():
self.taskArray.insert(0,task)
else:
index = self.__binarySearchIndex(
task.get_priority(),
self.taskArray,
methodcaller('get_priority')
)
self.taskArray.insert(index, task)
def __binarySearchIndex(self, value, array, accessMethod):
middle = (len(self.taskArray) / 2) if ((len(self.taskArray) % 2) == 0) else (len(self.taskArray) / 2) + 1
if middle == 1:
middle = 0
if value == accessMethod(array[middle]):
return middle
elif value < accessMethod(array[middle]):
self.__binarySearchIndex(value,array[:middle])
else:
self.__binarySearchIndex(value,array[middle:])
...
然后可以使用attrgetter
而不是methodcaller
from operator import attrgetter
class TaskManager(object):
def __init__(self):
self.taskArray = []
def addTask(self, task):
if (len(self.taskArray) == 0
or self.taskArray[0].get_priority() <= task.get_priority:
self.taskArray.insert(0,task)
else:
index = self.__binarySearchIndex(
task.get_priority,
self.taskArray,
attrgetter('get_priority')
)
self.taskArray.insert(index, task)
def __binarySearchIndex(self, value, array, accessMethod):
middle = (len(self.taskArray) / 2) if ((len(self.taskArray) % 2) == 0) else (len(self.taskArray) / 2) + 1
if middle == 1:
middle = 0
if value == accessMethod(array[middle]):
return middle
elif value < accessMethod(array[middle]):
self.__binarySearchIndex(value,array[:middle])
else:
self.__binarySearchIndex(value,array[middle:])
...
从操作员导入属性
类TaskManager(对象):
定义初始化(自):
self.taskArray=[]
def addTask(自我,任务):
如果(len(self.taskArray)==0
或self.taskArray[0]。获取_优先级()您的Task
类不需要这么多不必要的getter和setter。直接访问该属性,直到需要受保护的访问为止,此时您可以使用属性替换它们,而不会影响现有代码。您的Task
类不需要这么多不必要的getter和setter。访问属性di直到需要受保护的访问,这时您可以用属性替换它们,而不会影响现有代码。