Каков наиболее предпочтительный способ передачи атрибутов объекта в функцию в Python? - PullRequest
2 голосов
/ 01 ноября 2011

Я уверен, что я делаю это "неправильно", хотя это работает. Прямо сейчас, когда я вызываю функцию, я просто передаю весь объект, т.е.

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)

и затем ссылки на нужные мне атрибуты в рамках функции.

Что такое "питон" / правильный способ сделать это?

  • some_function(file_obj1)

  • some_function(file_obj1.filename)

  • the_filename = file_obj1.filename<br> some_function(the_filename)

Ответы [ 5 ]

5 голосов
/ 01 ноября 2011

Ну, это вполне очевидно. Это зависит от того, нужен ли some_function весь объект или только имя файла, в этом случае вы передаете весь экземпляр my_file_obj или только имя файла.

0 голосов
/ 01 ноября 2011

Ну, это зависит от того, что вы хотите сделать и какова ваша цель.

Если у вас есть функция, которая выглядит примерно так:

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, тогда вполне уместно передать объект.

НТН

0 голосов
/ 01 ноября 2011

Или вы можете добавить метод def __str__(self): return self.filename к вашему классу (потому что, возможно, печать файлового объекта должна в любом случае возвращать его имя в вашем дизайне) и принять любой тип объекта для вашей функции. Функция, например, выглядит следующим образом:

def openFile(obj):
    return open(str(obj), 'rU')

Таким образом, функция принимает как строки, так и объекты вашего класса. Смотри http://en.wikipedia.org/wiki/Duck_typing.

Не уверен, что этот дизайн рекомендуется - просто хочу указать на что-то менее очевидное. Может быть, это даже питон?

0 голосов
/ 01 ноября 2011

Все способы приемлемы, и выбор, который вы выберете, будет зависеть от выбора вашего приложения (или дизайна).

# 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)
0 голосов
/ 01 ноября 2011

Я думаю, some_function(file_obj1) является наиболее питоническим.

some_function(file_obj1.filename) не передает объект в функцию, он только передает атрибут имени файла в виде строки.Затем потребовалось бы много сложного кода, чтобы получить остальные атрибуты объекта.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...