我确信即使它有效,我也会“错误地”这样做。现在,当我调用一个函数时,我只传递整个对象,即
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_obj1
是my_file_obj
的实例:
some_function(file_obj1)
然后根据需要在函数中引用我需要的属性。
什么是“python”/正确的做法?
some_function(file_obj1)
some_function(file_obj1.filename)
the_filename = file_obj1.filename
some_function(the_filename)
答案 0 :(得分:5)
嗯,这很明显。这取决于some_function
是需要整个对象还是仅需要文件名,在这种情况下,您传递整个my_file_obj
实例或仅传递文件名。
答案 1 :(得分:0)
我认为some_function(file_obj1)
是最蟒蛇的。
some_function(file_obj1.filename)
没有将对象传递给函数,它只将filename属性作为字符串传递。然后需要大量繁琐的代码来获取对象的其余属性。
答案 2 :(得分:0)
所有方式都是可以接受的,您选择的方式取决于您的应用(或设计)选择。
# with this call the file_obj1 object reference is sent to some_function()
some_function(file_obj1)
# with this call there is no pass by reference. If filename is a
# string it is copied to some_function
some_function(file_obj1.filename)
# same as before, but here you are allocating a new var and copying the content
# to some_function
the_filename = file_obj1.filename
some_function(the_filename)
答案 3 :(得分:0)
或者你可以在你的类中添加def __str__(self): return self.filename
方法(因为,打印文件对象可能会在你的设计中返回它的名字)并接受你的函数的任何类型的对象。例如,该函数看起来像这样:
def openFile(obj):
return open(str(obj), 'rU')
像这样,函数接受类的字符串和对象。请参阅http://en.wikipedia.org/wiki/Duck_typing。
不确定是否推荐这种设计 - 只是想指出一些不太明显的东西。也许这甚至是pythonic?
答案 4 :(得分:0)
嗯,这取决于你想做什么以及你的目标是什么。
如果你的功能看起来像这样:
def some_function(file_thingy):
with open(file_thingy.filename, 'w') as f:
f.write("Icky Icky Icky Patang NeeeeWom!")
然后它会使事情变得更通用 - 只要你传递一个具有.filename
属性的对象,那么你的函数就可以了。一个更常见的例子是人们谈论鸭子打字。如果它看起来像一只鸭子,像鸭子一样走路,像鸭子一样嘎嘎叫,那么它就是一只鸭子!
所以如果你有以下功能:
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>")
所以在你的情况下,它实际上取决于你的功能应该做什么。如果它所做的只是读取文件的内容,那么你可以(也可能应该)只发送一个文件名。但是如果你想做一些事情,比如,根据你存储的MD5检查文件,或者设置那个MD5,那么传递对象是完全合适的。
HTH