在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
      vs
      foo.bar
      ),但这可能可以忽略不计。我没有基准测试,但实际上您所做的是将对象实例的引用传递给函数,而不是对象本身。因此,这样做应该不会增加计算量。从技术上讲,这是一种误导——Python确实是。在第二个示例中,您仍然在传递实际的字符串对象,但它恰好是不可变的,这与
      file_obj1
      实例不同。