目标:根据另一个对象的属性和当前对象的属性之和计算一个值,然后使用该值减去另一个值
预期输出: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