我有一个简单的类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级获得这个名字呢?
答案 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)