CodeQL 文档

超类属性覆盖子类方法

ID: py/attribute-shadows-method
Kind: problem
Security severity: 
Severity: error
Precision: high
Tags:
   - maintainability
   - correctness
Query suites:
   - python-security-and-quality.qls

单击查看 CodeQL 存储库中的查询

当超类的实例属性与子类的某个方法具有相同的名称,或者反过来,就会发生子类覆盖。Python 属性查找的语义意味着超类的实例属性会隐藏子类中的方法。

建议

重命名子类中的方法或重命名超类中的属性。

示例

以下代码包含子类覆盖的示例。当您调用Cow().milk()时,会引发错误,因为Cow().milk被解释为Mammal.__init__中设置的“milk”属性,而不是Cow中定义的“milk”方法。可以通过更改“milk”属性或“milk”方法的名称来修复此问题。

class Mammal(object):

    def __init__(self, milk = 0):
        self.milk = milk


class Cow(Mammal):

    def __init__(self):
        Mammal.__init__(self)

    def milk(self):
        return "Milk"

#Cow().milk() will raise an error as Cow().milk is the 'milk' attribute
#set in Mammal.__init__, not the 'milk' method defined on Cow.

  • ©GitHub, Inc.
  • 条款
  • 隐私