Полиморфизм в Python - PullRequest
       13

Полиморфизм в Python

3 голосов
/ 19 октября 2010
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

Заранее спасибо.

Ответы [ 2 ]

7 голосов
/ 19 октября 2010

Префикс атрибута с двойным подчеркиванием не делает атрибут закрытым, он просто делает полиморфизм невозможным, поскольку имя атрибута искажается именем класса current .Вместо этого измените его на один префикс подчеркивания.

1 голос
/ 20 октября 2010

Вы также можете оставить метод неопределенным в базовом классе для достижения того же эффекта.

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 бесценно иметь такое понимание наследования классов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...