在Python中向函数传递参数
在一个简单的例子中,假设我有在Python中向函数传递参数,python,functional-programming,Python,Functional Programming,在一个简单的例子中,假设我有 class Car: def __init__(self, operation): self.operation = operation def change_wheels(car, wheel_type): ... def repair_brakes(car, brake_pads, brake_fluid): ... car_list = [Car(change_wheels), Car(repair_brakes)] def serv
class Car:
def __init__(self, operation):
self.operation = operation
def change_wheels(car, wheel_type):
...
def repair_brakes(car, brake_pads, brake_fluid):
...
car_list = [Car(change_wheels), Car(repair_brakes)]
def service_car(car, wheel_type, brake_pads, brake_fluid):
car.operation(???)
如何将所需参数传递给
操作
函数?您可以提供汽车
参数,如车轮类型、制动器类型等,并将汽车对象传递给函数,然后检索汽车参数。这些属性对应于每辆车,因为它们有不同的制动类型等。。。将这些对象传递给函数可以使以后更容易获得所需的参数
class Car:
def __init__(self, wheel, brakes, operation):
self.wheel = wheel
self.brakes = brakes
self.operation = operation
def change_wheels(car):
print('Wheel', car.wheels)
def repair_brakes(car):
print('Brakes', car.brakes)
car_list = [Car('Wheel type', 'Brake type', change_wheels), Car('Wheel type', 'Brake type', repair_brakes)]
for car in car_list:
car.operation(car)
并非所有参数都已实现,这只是一个示例 不确定你想要什么,但是:
class Car:
def __init__(self, operation):
self.op = operation
def __call__(self, *args, **kwargs):
try: self.op(self, *args, **kwargs)
except TypeError: print('Unsupported operation.')
def change_wheels(car, wheel_type):
print('change_wheels()', wheel_type)
def repair_brakes(car, brake_pads, brake_fluid):
print('repair_brakes()', brake_pads, brake_fluid)
car_list = [Car(change_wheels), Car(repair_brakes)]
def service_car(car, wheel_type, brake_pads, brake_fluid):
#car.operation(???)
car(wheel_type)
car(brake_pads, brake_fluid)
for car in car_list: service_car(car, 'wt', 'bp', 'bf')
什么是
汽车操作
?你能提供一个最小的,可重复的例子吗?在Python中,可以以相同的方式调用所有可调用项。如果您在尝试调用car.operation
时遇到异常情况,这是相关信息。请使用列表作为参数,并选择所需的值。澄清一下:您本质上是问如何推断可调用函数所需的参数数和/或如何将可变数量的参数传递给可调用函数?如果你能详细说明你的设计动机,这可能会有所帮助。@Brian为不够清晰表示歉意-我意识到我错过了将Car
对象从Car\u list
传递到service\u Car
功能的步骤<代码>操作是一个函数(如更改滚轮
),参数需要来自上下文。看起来不错。希望你能从发布问题的人那里得到反馈。@BalajiAmbresh谢谢!你的回答也很好,但我宁愿避免硬编码。经过几个额外的功能,它变得混乱!谢谢问题是car\u list
是静态的,在我读入文本文件之前,参数是未知的,因此我将该文件归类为car类型。然后我想调用汽车上所需的维修操作,这取决于汽车的类型。我还从落选票中意识到,我的问题在细节上可能很糟糕。@LuigiPlinge是的,如果这是一件事,我会建议args/kwargs。顺便说一句,我建议在阅读文件后,像我一样将这些参数添加到car对象中。这样,您的代码保持良好的可读性。或者重新设计控件结构,以便在读取文件时创建对象。或者你接受了另一个答案,而这不是你想要的?@LuigiPlinge你能用文本文件内容和阅读过程的样本编辑你的问题吗,这样我就可以给我的答案添加一个有效的解决方案吗?如果我读对了,这个解决方案取决于传递的参数数量?不幸的是,我不能保证每个操作都会有所不同。您可以在构造时显式地传递您想要的任何操作(请参见\uuu init\uuu()
)。它不在乎你以后将多少arg传递给操作:它们将聚集在*args和**kwargs中。(已编辑的代码,现在可能更清晰了。)但假设还有另一个操作需要1 arg,如def change\u oil(car,oil)
。我将使用wheel\u type
参数调用change\u oil
。正确:在这种情况下,它将无法区分。