Наследование Python - как отключить функцию

После ввода каждого std :: cin и нажатия «enter» в буфере cin останется '\ n', и вам потребуется какой-то метод для его устранения. Если есть только '\ n' или другие, используйте getchar() в качестве простого решения. И если перед '\ n' есть больше символов, вы можете использовать getline(), чтобы удалить их все, пока не получите '\ n'.

31
задан Boris Gorelik 23 October 2008 в 23:04
поделиться

3 ответа

Действительно нет никаких истинных "частных" атрибутов или методов в Python. Одна вещь, которую можно сделать, просто переопределить метод, который Вы не хотите в подклассе и повышаете исключение:

>>> class Foo( object ):
...     def foo( self ):
...         print 'FOO!'
...         
>>> class Bar( Foo ):
...     def foo( self ):
...         raise AttributeError( "'Bar' object has no attribute 'foo'" )
...     
>>> b = Bar()
>>> b.foo()
Traceback (most recent call last):
  File "<interactive input>", line 1, in <module>
  File "<interactive input>", line 3, in foo
AttributeError: 'Bar' object has no attribute 'foo'
23
ответ дан 27 November 2019 в 22:13
поделиться
class X(object):
    def some_function(self):
        do_some_stuff()

class Y(object):
    some_function = None

Это может привести к некоторым противным и твердым найти исключения брошенными, хотя, таким образом, Вы могли бы попробовать это:

class X(object):
    def some_function(self):
        do_some_stuff()

class Y(object):
    def some_function(self):
        raise NotImplementedError("function some_function not implemented")
5
ответ дан 27 November 2019 в 22:13
поделиться

метод kurosch решения проблемы не довольно корректен, потому что можно все еще использовать b.foo, не добираясь AttributeError. Если Вы не вызываете функцию, никакая ошибка не происходит. Вот два способа, которыми я могу думать, чтобы сделать это:

import doctest

class Foo(object):
    """
    >>> Foo().foo()
    foo
    """
    def foo(self): print 'foo'
    def fu(self): print 'fu'

class Bar(object):
    """
    >>> b = Bar()
    >>> b.foo()
    Traceback (most recent call last):
    ...
    AttributeError
    >>> hasattr(b, 'foo')
    False
    >>> hasattr(b, 'fu')
    True
    """
    def __init__(self): self._wrapped = Foo()

    def __getattr__(self, attr_name):
        if attr_name == 'foo': raise AttributeError
        return getattr(self._wrapped, attr_name)

class Baz(Foo):
    """
    >>> b = Baz()
    >>> b.foo() # doctest: +ELLIPSIS
    Traceback (most recent call last):
    ...
    AttributeError...
    >>> hasattr(b, 'foo')
    False
    >>> hasattr(b, 'fu')
    True
    """
    foo = property()

if __name__ == '__main__':
    doctest.testmod()

Панель использует шаблон "переноса" для ограничения доступа к перенесенному объекту. у Martelli есть хороший разговор контакт с этим. Baz использует свойство, встроенное для реализации протокола дескриптора для атрибута для переопределения.

18
ответ дан 27 November 2019 в 22:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: