python - Python 3 中的类对象/实例是否通过引用传递?

标签 python python-3.x

这个程序修改类“myclass”_x 和_y 的对象,但我没有将它作为参数传递给函数try_block。如何修改对象?

class AddSub:
    def _init_(self): #how do default parameters work? 
        self._x, _y

    def set_x(self, num):
        self._x = num

    def set_y(self, num):
        self._y = num   

    def add(self):
        return self._x + self._y

    def sub(self):
        return self._x - self._y

def try_block():
    try:
        ch = int(input("type 1 to add, and 2 to subtract: "))

        myclass.set_x(int(input("enter an x value: "))) #how does myclass get modifed?

        myclass.set_y(int(input("enter a y value: ")))

        return ch

    except ValueError:
        print("Invalid entry.")

        ch = try_block()

        return ch


myclass = AddSub()

choice = try_block()

if choice == 1:
    print(myclass.add())

elif choice == 2:
    print(myclass.sub())

最佳答案

在开始回答您的问题之前,我想提一下有关术语的一些事情。您的 myclass 值是一个实例,而不是一个类。您的代码中确实有一个名为 AddSub 的类。当您调用 AddSub() 时,您创建了该类的一个实例。为此类事情学习正确的术语很重要,这样您就可以提出好的问题并理解您得到的答案。

您的代码即将运行,因为您将 AddSub 类的一个实例保存到名为 myclass 的全局变量中。稍后,您从 try_block 函数调用该全局变量的一些方法。这在 Python 中是合法的,但通常不推荐。

相反,您应该将对象作为参数传递:

def try_block(value):
    try:
        value.set_x(whatever())
    except ValueError:
        pass

您可以通过将 AddSub 类的实例传递给函数来调用它:

myAddSub = AddSub() # create the instance
try_block(myAddSub) # pass it to the function

这要好得多,因为它不依赖于具有特定值的全局变量来工作,并且如果需要,您可以使用许多不同的 AddSub 实例调用它。

当前损坏的代码部分是 AddSub 类的构造函数。无需声明变量。您可以随时分配给他们。如果你想设置默认值,你也可以这样做:

def __init__(self):
    self._x = 0
    self._y = 0

相反,如果您希望能够在构造对象时设置值,则可以向 __init__ 方法添加额外的参数。它们也可以有默认值,允许调用者省略其中的一些或全部:

def __init__(self, x=0, y=0):
    self._x = x
    self._y = y

根据该定义,所有这些都是构造 AddSub 实例的有效方法:

a = AddSub()     # gets default 0 value for both _x and _y
b = AddSub(5)    # gets default 0 value for _y
c = AddSub(y=5)  # gets default 0 value for _x
d = AddSub(2, 3) # no defaults!

最后一点与您的主要问题基本无关:您的 try_block 函数命名不当,并且实现方式比必要的更复杂。我认为它不是递归的,而是作为一个循环更有意义,就像在这个伪代码版本中一样:

def exception_prone_task():
    while True: # loops forever, or until a "return" or "break" statement happens
         try:
             result = do_stuff_that_might_raise_an_exception()
             return result # you only get here if no exception happened

         except WhateverExceptions as e:
             report_about_about_the_exceptions(e)

关于python - Python 3 中的类对象/实例是否通过引用传递?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13487976/

相关文章:

python - 实现异步迭代器

python-3.x - 使用requirements.txt从github安装python包

python - 如何将 3 维数组连接到普通数组中?

python - 从 Component 类访问 Composite 类字段

python - ImportError : No module named flask. ext.login 即使安装了 Flask

python - 在 Pandas Dataframe 中将上三角矩阵转换为下三角矩阵

Python Web自动化: HTTP Requests OR Headless browser

python - Python 中的 Web 服务?

python - 我需要帮助将 urlpatterns url 转换为等效路径

python - 在 Python lxml 中抓取 HTML 表