这个程序修改类“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/