德米特法则与Python

4 投票
3 回答
3199 浏览
提问于 2025-04-16 05:51

有没有工具可以检查Python代码是否符合德梅特法则?

我在pychecker中看到提到德梅特法则,但这个工具似乎对这个法则的理解和我预期的不太一样:http://en.wikipedia.org/wiki/Law_of_Demeter

维基百科上的定义是:德梅特法则要求一个对象O的方法M只能调用以下几种对象的方法:

  1. 对象O自己
  2. 方法M的参数
  3. 在方法M内部创建的任何对象
  4. 对象O的直接组成部分
  5. 在方法M的范围内,O可以访问的全局变量

3 个回答

1

你可以这样打破那个规则:

class SomeClass:
    def someMethod(self):
        self.getSomeOtherClass().someOtherMethod() # this breaks the law
    def getSomeOtherClass(self):
        class_ = SomeOtherClass()
        return class_

还是说不行呢?

1

德梅特法则...一个对象O的方法M只能调用以下几种对象的方法:

  1. O自己——也就是self变量。这一点很简单。
  2. M的参数——也就是传给方法的局部变量。换句话说,就是在locals()里。
  3. 在M内部创建的任何对象——也就是局部变量。也就是说,在locals()里。
  4. O的直接组成对象——也就是self变量。
  5. 在M的作用域内,O可以访问的全局变量——也就是在global语句中命名的变量,或者是那些在局部命名空间中找不到的全局变量的隐式引用。也就是说在globals()里。

嗯……函数没有其他可访问的变量,对吧?因为命名空间的工作方式,我看不出有什么可能会违反这个法则。

你有没有Python代码的例子,能违反这些规则中的一个?

你会如何访问另一个命名空间?

1

你提供的链接里对这个法律的解释太模糊了,太主观,根本无法通过任何自动化工具有效检查。你需要想出一些具体的规则,这些规则能确保代码符合这个法律。然后你就可以检查这些规则是否被遵守。

撰写回答