【问题标题】:Property does not seem to work the right way财产似乎没有以正确的方式运作
【发布时间】:2019-11-23 20:19:32
【问题描述】:

我无法弄清楚为什么最后一个断言不起作用。错误消息“type object 'Student' has no attribute 'name'”让我更加困惑,因为 Student 有一个名为 name 的属性。有什么解决办法吗?

class Student:

def __init__(self, name, imt_name, semester):
    self.name = name
    self.imt_name = imt_name
    self.semester = semester

def get_name(self):
    return self.name

def __str__(self):
    return ("{} [{}] in Semester {}".format(self.name, self.imt_name, self.semester))

x = property(get_name)

#asserts and test
assert type(Student) is type

student_horst = Student("Horst", "horst99", 2)
assert student_horst.name == "Horst"
assert student_horst.imt_name == "horst99"
assert student_horst.semester == 2

student_horst.semester = 3
assert student_horst.semester == 3

#this one is not working!
assert isinstance(getattr(Student, "name"), property)

【问题讨论】:

  • 假设缩进修复;您尚未命名属性名称,而是将其命名为 x。 实例有一个属性名,但类没有。
  • 如果我将属性命名为“名称”,它会解决问题吗?
  • 那么你会遇到一个不同的问题,因为 name 的 getter 访问 name 属性,它调用 name 的 getter,...
  • 所以更改 init 中的参数并重命名属性将修复它
  • 是的;按照惯例,支持属性使用前导下划线 _name 命名。

标签: python class properties assert getter


【解决方案1】:

name 从来都不是属性,x 是

class Student:
    def __init__(self, name):
        self._name = name # this is an attribute

    @property
    def name(self): # property
        return self._name

    def get_name(self):
        return self._name

    x = property(get_name) # x is a property not _name

student = Student('Horst')
print(student._name, student.name, student.x, sep='\n')
assert isinstance(getattr(Student, 'name'), property)
assert isinstance(getattr(Student, 'x'), property)

【讨论】:

    【解决方案2】:

    要检查实例是否具有给定属性(按名称),您需要使用hasattr 函数,如下所示:

    assert hasattr(student_horst, "name")
    

    【讨论】:

    • 您还更改了函数的参数,更重要的是。这才是真正的区别。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-12-30
    • 2010-09-08
    • 2016-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多