【问题标题】:How to use object of one class in the method of another class?如何在另一个类的方法中使用一个类的对象?
【发布时间】:2020-12-31 02:57:10
【问题描述】:

总的来说,我对 Python 和 OOP 非常陌生。我发现了一个问题,需要我让 2 个类使用从一个类创建的对象作为另一个类的参数。问题表明我必须在不更改给定代码的情况下创建类、构造函数和方法以获取示例输出。 我的代码:

class B:
    def __init__(self,x):
        self.__x=x      #private variable
    def method(self,y):
        self.__y=y      #private variable
    def details(self):
        print(f'x = {self.__x}') #private variable
        print(self.__y)
class A:
    def __init__(self,z):
        self.z=z
#==================================
#This can't be changed.
obj1=A('a')
obj2=A('b')
obj3=B('x')
obj3.method(obj1)
obj3.method(obj2)
obj3.details()

但这给了我对象 obj1 和 obj2 的内存地址,而不是值 a 和 b。我还尝试取一个空字符串,然后将 a 和 b 连接到它,但对象类型不能与 str 连接。所以,我现在基本上卡住了。任何形式的帮助将不胜感激。谢谢。

示例输出为:

x = x
a
b

【问题讨论】:

  • 它没有给你“内存地址”,这是任何对象的默认字符串表示。为什么您期望它会打印其他内容?
  • 顺便说一句,self.__x = x 不是私人的。 Python 没有私有变量。要表示变量不是公共 API 的一部分,请使用 单下划线。双下划线用于名称修饰,与私有不同
  • 我的问题是如何获取以对象为参数的方法。我能感觉到我犯的主要错误是在方法和打印从方法获得的值。
  • 这正是它已经在做的事情。该方法将对象作为参数并将其分配给self.__y。为什么你认为这行不通?问题在于您要打印的内容。
  • 所以我的打印声明需要更改?如何打印分配的值而不是像 <__main__.A object at 0x016DC3D0> 这样的东西?

标签: python oop methods constructor


【解决方案1】:

您需要使用print(self.__y.z) 而不是print(self.__y) 来获取对象存储在z 中的值。

但是要获得该示例输出,您必须跟踪曾经传递给 obj3.method 方法的所有对象,而不仅仅是最后一个。我的意思是self.__y 需要是一个列表。

class B:
    def __init__(self,x):
        self.__x=x      #private variable
        self.__y=[]
    def method(self,y):
        self.__y.append(y)      #private variable
    def details(self):
        print(f'x = {self.__x}') #private variable
        for obj in self.__y:
            print(obj.z)
class A:
    def __init__(self,z):
        self.z=z
#==================================
#This can't be changed.
obj1=A('a')
obj2=A('b')
obj3=B('x')
obj3.method(obj1)
obj3.method(obj2)
obj3.details()

由于这些对象实际上并不代表任何东西,因此命名变得困难,而且我认为这会使整个问题更难理解,但下面是我将如何命名您确实可以控制的变量。正如 cmets 已经提到的那样,Python 中并没有真正的私有变量的概念,但是如果您想警告人们应该将变量视为私有变量,我们通常会在变量前面加上一个下划线。

class B:
    def __init__(self, prop):
        self.prop = prop
        self.obj_A_list = []

    def method(self, obj_a):
        self.obj_A_list.append(obj_a)

    def details(self):
        print(f'x = {self.prop}')
        for obj in self.obj_A_list:
            print(obj.prop)

class A:
    def __init__(self, prop):
        self.prop = prop

#==================================
#This can't be changed.
obj1=A('a')
obj2=A('b')
obj3=B('x')
obj3.method(obj1)
obj3.method(obj2)
obj3.details()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-06-25
    • 2013-04-21
    • 1970-01-01
    • 2013-02-17
    • 1970-01-01
    • 2019-03-11
    • 2017-08-16
    • 1970-01-01
    相关资源
    最近更新 更多