从另一个类访问类变量

时间:2017-10-23 23:28:35

标签: python python-3.x

我有一个简单的类A,它从用户那里获取名称。

class A:
   def __init__(self, name = ''):
       self.name = name

然后我想创建一个打印出这个名字的B类。我试过了:

class B:
    def print_name(printing_name = A.name):
        print(printing_name)

然后我称这些方法为:

m1 = A("x")
B.print_name(m1)

这会返回错误

Traceback (most recent call last):
  File "so.py", line 5, in <module>
    class B:
  File "so.py", line 7, in B
    def print_name(printing_name = A.name):
AttributeError: class A has no attribute 'name'

我知道我没有在类A中分配类变量,因此name属性与特定实例一起使用,而不是整个类。但是,name属性必须与每个特定实例连接,因为它会根据具体情况而变化。那我该如何在B级获得这个名字呢?

4 个答案:

答案 0 :(得分:3)

将您的class B更改为:

class B:

    @staticmethod
    def print_name(obj):
        print(obj.name)

print_name方法可能应该装饰为"static method"name的属性“self”是一个实例属性,无法直接从类本身引用。

答案 1 :(得分:1)

这是正确的:名称是实例属性,而不是类属性。在这种情况下, m1 有一个名称,但 A 类没有。您需要访问输入参数的名称,而不是尝试打印类属性。

您还需要将 B.print_name 设为类函数,因为您不是从 B 的实例调用它。

class B:

    @staticmethod
    def print_name(inst):
        print(inst.name)

输出:

x

答案 2 :(得分:1)

修改:如果你了解它的作用,建议@staticmethod的答案是理想的。

class A:
    def __init__(self, name = ''):
        self.name = name

class B:
    def __init__(self):
        pass
    def print_name(self, var):
        print (var.name)

输出:

>>> m1 = A("X")
>>> b = B()
>>> b.print_name(m1)
X
>>>

答案 3 :(得分:0)

在此实例中,A是类的名称,您不应将其作为调用print_name方法的默认参数。看看Python的关键字参数,你会看到你所写的实际意味着你有一个默认值设置为类A的.name属性,除非实例化类,否则它不存在(即一个对象是由类创建的。

您的B课程应为:

class B:
    def print_name(printing_object):
        print(printing_object.name)