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