2010-10-19 86 views
3
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多态性在Python

预先感谢您。

+2

值得注意的是,通过让基方法引发NotImplementedError破坏多重继承来实现'抽象方法'。使用[abc](http://docs.python.org/library/abc.html)模块是更好的方法。 – aaronasterling 2010-10-19 02:40:15

+0

@Michael Anderson:StackOverflow维护一个完整的更改日志。您不需要发表评论,指出您进行了更改。显而易见,不言而喻。请删除您的评论。 – 2010-10-19 02:42:05

回答

7

使用双下划线前缀一个属性不会使该属性变成私有的,它只是使多态性不可能,因为属性名称与当前的类名称相冲突。改为将其改为单个下划线前缀。

+3

更好的是,只要避免所有与“隐私”混淆,直到你有一个实际的问题与实际上使用属性或方法不正确地破坏你的课堂的人。直到有人**实际上**误解了你的API,不要使用任何形式的隐私结构。 – 2010-10-19 02:40:21

+0

哦,我的!就是这样。 :| 我总是将Python规则与PHP规则混淆。对不起,谢谢你的答案,伙计们! :) – 2010-10-19 02:43:38

+0

值得注意的是,under/dunder约定对于暗示将会相对可靠的公共方法与随时可能改变的私人方法之间的区别是有用的。 – 2010-10-20 03:08:11

1

您也可以在基类中保留未定义的方法以达到相同的效果。

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类对类继承的理解是无价的。