在Python中将对象属性传递给函数的最佳方法是什么?

时间:2011-11-01 13:25:37

标签: 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_obj1my_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)

5 个答案:

答案 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