如何将属性从一个对象传递到另一个对象以计算值



目标:根据另一个对象的属性和当前对象的属性之和计算一个值,然后使用该值减去另一个值

预期输出:target_value=5

问题:AttributeError:类型对象"x"没有属性"attribute1">

对象1:

class x():
def __init__(self, attribute1):
self.attribute1 = attribute1

对象2:

from object_one import x
class y():
def __init__(self, attribute2):
self.attribute2 = attribute2

def calculate_attributes(self, target):
value = x.attribute1 + y.attribute2
target -= value

Main:

from object_one import x
from object_two import y
object_x = x(5)
object_y = y(10)
target_value = 20
object_y.calculate_attributes(target_value)
print(target_value)

问题的直接解决方案

在对象1中,您正在声明字段属性1。在Object2中,您正在导入X.

X没有名称为attribute1的属性,只有类型为x的对象有。您必须通过添加一个参数将对原始对象x的引用传递到calculate_attributes(self, target)方法中,如下所示:

class y():
def __init__(self, attribute2):
self.attribute2 = attribute2

def calculate_attributes(self, target, x_obj):
value = x_obj.attribute1 + y.attribute2
target -= value

之后,您将通过执行以下操作来使用此calculate_attributes方法:

object_y.calculate_attributes(target_value, object_x)

更深入的解释-为什么会发生这种情况

类基本上是对象的蓝图。在定义了一个类之后,可以通过实例化其类型的对象来使用它。

带线路

object_x = x(5)

您正在制作类型x.的对象

这个对象有自己的域-它本身是有生命的,并且只是根据它的类蓝图创建的(这里:"类型"、"蓝图"、"父类"-当我在这里发言时,它们的意思都是一样的(。

__init__方法中,当您将self.attribute2设置为具有相同名称的参数时,您将设置实例化的类的任何对象字段。这意味着两个y类型的对象可以具有不同的attribute2

然而,您也可以使类包含一个";字段";。这可以这样做:

class y():
who_made_this_class = "george"
def __init__(self, attribute2):
self.attribute2 = attribute2

这可以称为静态类变量。现在,当您实例化一个新的y对象时,您会看到如下行为:

obj_one = y(15);
obj_two = y(2020);
print("Object ones attribute2 value is: " + str(obj_one.attribute2))
print("Object twos attribute2 value is: " + str(obj_two.attribute2))
print("Object ones who_made_this_class value is: " + str(obj_one.who_made_this_class))
print("Object twos who_made_this_class value is: " + str(obj_two.who_made_this_class))

预期输出为:

Object ones attribute2 value is: 15
Object twos attribute2 value is: 2020
Object ones who_made_this_class value is: george
Object twos who_made_this_class value is: george

相关内容

最新更新