在Python中,向函数传递对象属性的最佳方式是什么?
我确信我这样做是“错误的”,即使它工作。现在,当我调用一个函数时,我只是传递整个对象,即在Python中,向函数传递对象属性的最佳方式是什么?,python,oop,Python,Oop,我确信我这样做是“错误的”,即使它工作。现在,当我调用一个函数时,我只是传递整个对象,即 class my_file_obj: def __init__(self,filename): self.filename = filename self.owner = None self.file_type = None self.fileflag = 0 self.md5 = None 函数调用,其中file\u
class my_file_obj:
def __init__(self,filename):
self.filename = filename
self.owner = None
self.file_type = None
self.fileflag = 0
self.md5 = None
函数调用,其中file\u obj1
是my\u file\u obj
的一个实例:
some_function(file_obj1)
然后根据需要在函数中引用所需的属性
“python”/正确的方法是什么
某些功能(文件obj1)
some_函数(file_obj1.filename)
文件名=file\u obj1.filename
一些函数(文件名)
- 很明显。这取决于
某个函数
需要整个对象还是只需要文件名,在这种情况下,您传递整个我的文件
实例还是只传递文件名。我认为某个函数(文件
是最具python风格的
some_函数(file_obj1.filename)
不将对象传递给函数,它只将filename属性作为字符串传递。然后需要大量的精细代码来获取对象的其余属性 所有方法都是可以接受的,您将根据您的应用程序(或设计)选择哪些方法
或者,您可以向类中添加一个
def\uuu str\uuuu(self):return self.filename
方法(因为,打印文件对象无论如何都应该在设计中返回其名称),并为函数接受任何类型的对象。例如,该函数如下所示:
def openFile(obj):
return open(str(obj), 'rU')
def some_function(file_thingy):
with open(file_thingy.filename, 'w') as f:
f.write("Icky Icky Icky Patang NeeeeWom!")
与此类似,函数接受类的字符串和对象。看
不确定是否推荐这种设计——只想指出一些不太明显的东西。也许这甚至是一种肾盂手术?好吧,这取决于你想做什么以及你的目标是什么 如果您有一个如下所示的函数:
def openFile(obj):
return open(str(obj), 'rU')
def some_function(file_thingy):
with open(file_thingy.filename, 'w') as f:
f.write("Icky Icky Icky Patang NeeeeWom!")
然后它使事情变得更加通用-只要您传入一个具有.filename
属性的字符串对象,那么您的函数就可以工作。一个更常见的例子是当人们谈论duck类型时。如果它看起来像鸭子,走路像鸭子,嘎嘎叫像鸭子,那么它就是鸭子
因此,如果您具有以下功能:
def do_duck_things(a_duck):
print(a_duck.appearance)
a_duck.waddle()
a_duck.quack()
print("It must be a duck!")
然后,您可以向其传递以下实例:
class Duck:
def __init__(self):
self.appearance = "White, like the AFLAC duck"
def quack(self):
print("Quaaaaaack!")
def waddle(self):
print("The duck waddles.")
或以下任一类的实例:
class UglyDuckling:
def __init__(self):
self.appearance = "Suspiciously like a baby goose"
def waddle(self):
print("The ugly duckling waddles a bit like a duck.")
def quack(self):
print("Hoooonk!")
class Human:
def __init__(self):
self.appearance = "Looks like a human in a duck costume"
def waddle(self):
print("Surprisingly, he waddles quite like a duck.")
def quack(self):
print("<A sound quite like Donald Duck would make>")
class丑小鸭:
定义初始化(自):
self.earance=“像小鹅一样可疑”
def摇摇晃晃(自我):
打印(“丑小鸭摇摇晃晃有点像鸭子。”)
def-quack(self):
打印(“胡闹!”)
类人:
定义初始化(自):
self.earance=“看起来像穿着鸭子服装的人”
def摇摇晃晃(自我):
打印(“令人惊讶的是,他摇摇晃晃的像只鸭子。”)
def-quack(self):
打印(“”)
所以在你的例子中,这实际上取决于你的函数应该做什么。如果它所做的只是读取一个文件的内容,那么您可以(也可能应该)向它发送一个文件名。但是如果您想做一些事情,比如,对照存储的MD5检查文件,或者设置MD5,那么传入对象是非常合适的
HTH这真的是你的决定。您只需要使用文件名吗?您是否会传入一个没有对象关联的文件名?@Rafeketler:我想这就足够了。不确定Python中是否建议直接访问对象的数据成员。您可以为此使用访问功能,如
def getFilename(self)
或类似功能(有关更多信息,请参阅)。感谢您的回复。我不确定python是否有接口,或者getter类型函数是否是首选方法。我假设传递整个对象会占用更多内存/计算开销,对吗?@user982599:Python中的所有名称都是引用。唯一的区别是属性查找时间(foo
vsfoo.bar
),但这可能可以忽略不计。我没有基准测试,但实际上您所做的是将对象实例的引用传递给函数,而不是对象本身。因此,这样做应该不会增加计算量。从技术上讲,这是一种误导——Python确实是。在第二个示例中,您仍然在传递实际的字符串对象,但它恰好是不可变的,这与file_obj1
实例不同。