超类属性覆盖子类方法¶
ID: py/attribute-shadows-method
Kind: problem
Security severity:
Severity: error
Precision: high
Tags:
- maintainability
- correctness
Query suites:
- python-security-and-quality.qls
当超类的实例属性与子类的某个方法具有相同的名称,或者反过来,就会发生子类覆盖。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.