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

How to pass an attribute from an object to another to calculate a value

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

预期输出: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

主要:

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 中,您正在导入 class X.

class 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)

更深入的解释 - 为什么会这样?

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

同线

object_x = x(5)

您正在制作 类型 x.

的对象

这个对象有它自己的字段 - 它是独立存在的,并且只是从它的 class 蓝图创建的(这里是:“type”,“blueprint”,“parent class" - 当我在这里说话时,所有的意思都是一样的)。

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

但是,您还可以 使 class 包含一个“字段”。这可以像下面这样完成:

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

这可以称为静态 class 变量。现在,当您实例化一个新的 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