【问题标题】:Polymorphism in PythonPython中的多态性
【发布时间】:2010-10-19 02:32:20
【问题描述】:
class File(object):
    def __init__(self, filename):
        if os.path.isfile(filename):
            self.filename = filename
            self.file = open(filename, 'rb')
            self.__read()
        else:
            raise Exception('...')

    def __read(self):
        raise NotImplementedError('Abstract method')

class FileA(File):
    def __read(self):
        pass

file = FileA('myfile.a')

# NotImplementedError: Abstract method

我的问题:怎么了?如何将我的代码修复为 FileA 使用 FileA.__read() 而不是 File.__read() 来读取文件? :S

提前谢谢你。

【问题讨论】:

  • 值得注意的是,通过让基方法 raise NotImplementedError 来实现“抽象方法”会破坏多重继承。使用abc 模块是一种更好的方法。
  • @Michael Anderson:StackOverflow 维护着完整的更改日志。您无需发表评论表明您进行了更改。这很明显超越了重复。请删除您的评论。

标签: python methods polymorphism


【解决方案1】:

使用双下划线前缀属性不会使属性成为私有属性,它只会使多态性变得不可能,因为属性名称与 current 类名称混淆。改为将其更改为单个下划线前缀。

【讨论】:

  • 更好的是,避免所有关于“隐私”的胡闹,直到您遇到实际问题,即有人实际上不正确地使用属性或方法破坏了您的类。在有人实际上误解您的 API 之前,请勿使用任何类型的隐私构造。
  • 天哪!就是这样。 :|我总是将 Python 规则与 PHP 规则混淆。对不起,谢谢你们的回答,伙计们! :)
  • 值得注意的是,under/dunder 约定对于建议将相对可靠的公共方法与可能随时更改的私有方法之间的区别很有用。
  • 双下划线前缀不是约定俗成的,它是导致重整的语法糖。
【解决方案2】:

你也可以在基类中不定义方法来达到同样的效果。

import os
class File(object):
    def __init__(self, filename):
        if os.path.isfile(filename):
            self.filename = filename
            self.file = open(filename, 'rb')
            self._read()
        else:
            raise Exception('...')
class FileA(File):
    def _read(self):
        pass
file = FileA('myfile.a')

对类继承有这种理解对于理解 Python 类是无价的。

【讨论】:

    猜你喜欢
    • 2011-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-12
    • 2011-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多