سؤال

في C ++ يمكنك تعطيل وظيفة في الفئة الأصل من قبل إعلانها أنها خاصة في فئة الأطفال. كيف يمكن القيام بذلك في بيثون؟ بمعنى آخر. كيف يمكنني إخفاء وظيفة الأم من الواجهة العمومية الطفل؟

هل كانت مفيدة؟

المحلول

وهناك في الحقيقة ليست أي صحيح "الخاص" سمات أو الأساليب في بيثون. الشيء الوحيد الذي يمكن القيام به هو مجرد تجاوز أسلوب كنت لا تريد في فئة فرعية، ورفع استثناء:

>>> 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'

نصائح أخرى

وطريقة 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()

وبار يستخدم نمط "التفاف" لتقييد الوصول إلى كائن ملفوفة. مارتيلي لديه حديث حسن التعامل مع هذا. يستخدم باز على العقارات المبنية في لتنفيذ بروتوكول اصف ل السمة لتجاوز.

وهناك تباين على إجابة لkurosch:

class Foo( object ):
    def foo( self ):
        print 'FOO!'

class Bar( Foo ):
    @property
    def foo( self ):
        raise AttributeError( "'Bar' object has no attribute 'foo'" )

b = Bar()
b.foo

وهذا يثير AttributeError على الممتلكات بدلا من عندما يتم استدعاء الأسلوب.

وكنت قد اقترح في تعليق ولكن للأسف لم يكن لديك سمعة لذلك حتى الآن.

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")

وهذا هو أنظف وسيلة وأنا أعلم أن تفعل ذلك.

وتجاوز الطرق ويكون كل واحد من أساليب متجاوزة استدعاء disabledmethods من طريقة (). مثل هذا:

class Deck(list):
...
@staticmethod
    def disabledmethods():
        raise Exception('Function Disabled')
    def pop(self): Deck.disabledmethods()
    def sort(self): Deck.disabledmethods()
    def reverse(self): Deck.disabledmethods()
    def __setitem__(self, loc, val): Deck.disabledmethods()

وهذا يمكن أن يكون أكثر بساطة.

@property
def private(self):
    raise AttributeError

class A:
    def __init__(self):
        pass
    def hello(self):
        print("Hello World")

class B(A):
    hello = private # that short, really
    def hi(self):
        A.hello(self)

obj = A()
obj.hello()
obj = B()
obj.hi() # works
obj.hello() # raises AttributeError
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top