【问题标题】:Return multiple values from class in python?从python中的类返回多个值?
【发布时间】:2018-11-04 09:32:12
【问题描述】:

我有这个小测试代码来看看类是如何工作的。

class Person:
    def __init__(self):
      self.name = ("Mike")

    def myfunc(self):
      print("Hello my name is " + self.name)

p1 = Person()
hello = p1.myfunc()
hello

我想要的是从类中返回 self.name,这样我就可以在类外使用它。这可能吗?我希望返回的值没有“你好,我的名字是”字符串,所以在打印返回的值时,输出是“迈克”而不是“你好,我的名字是迈克”。目前,它只是一个值,因为这是一个测试代码。如果它在这里完美运行,我会将它放在我的真实代码中以确保它正常运行。

【问题讨论】:

  • print(p1.name)?
  • 您可以通过 p1.name 访问该名称 - 类似地,对于您从类中创建的任何其他 Person 对象
  • 我已经尝试将 return 放入 myfunc(self) 但之后我该怎么办?
  • 请注意,hello = ... 分配给 None,因为您不会在 myfunc 中返回任何内容。
  • 如何从一个函数返回多个值已经回答here,所以除非你解释你的问题与那个问题有何不同,否则没有必要发布答案。

标签: python class variables


【解决方案1】:

在 python 中,没有办法限制或授予对属性的访问权限。默认情况下,您可以访问对象外部的属性,这与 Java 不同的是,您只能访问像 public 一样签名的属性。 因此,您可以通过编写 person1.name 直接检索实例上的名称属性,其中 person1 是 Person 类的一个实例,但是在面向对象编程中是不好的做法(OOP )。

另一种方法是创建两个函数,一个 setter 和一个 getter,分别设置和返回感兴趣属性的值。在您的情况下,它将是:

def setName(self,name):
    self.name = name

def getName(self):
    return self.name

这样你就尊重OOP数据封装的一些原则,当你需要看什么名字的时候简单调用实例上的方法person1.getName()

注意:

这种方法的一个优点是,现在您可以验证您的实例可以假设什么值。对于 Person 类和示例,设置一个数字没有意义,因此在更新之前检查 name 参数是否真的是一个字符串会很好。

阅读更多关于private attributes in pythonhere。 对于 Getter 和 setter,请查看 link,您也可以在其中了解 Properties 概念。

【讨论】:

    【解决方案2】:

    尝试使用p1.pnamep1.myfunc() 不会给出输出,所以没有必要存储它

    【讨论】:

      【解决方案3】:

      (1)使用返回变量从类中的函数正常返回值。

      (2)然后在类外打印,variable = (myClass().variable) 然后打印变量。

      (3) 如果不想打印出来,就照常使用变量即可。

      您已经成功地从类中获取值并在整个程序中使用它,而不需要 global 关键字!

      编辑看起来你甚至不需要返回值: (myClass().variable) 将直接从类中获取值,甚至不需要返回值,正如此代码所支持的那样:

      class Person:
          def __init__(self):
              self.name1 = ("Mike")
              self.name2 = ("John")
              self.name3 = ("Jane")
              self.name4 = ("Doe")
      
      name1, name2, name3, name4 = (Person().name1), (Person().name2), (Person().name3), (Person().name4)
      print (name1, name2, name3, name4)
      

      【讨论】:

        猜你喜欢
        • 2018-08-17
        • 2016-03-25
        • 2019-10-30
        • 2012-07-04
        • 1970-01-01
        • 2023-03-27
        • 2020-01-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多