سؤال

وكيف يمكنني توسيع فئة مدمج في بيثون؟ وأود أن أضيف طريقة إلى فئة شارع.
لقد فعلت بعض البحث ولكن كل أنا وجدت من المشاركات القديمة، وأنا على أمل شخص يعرف شيء أحدث.

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

المحلول

وفقط فئة فرعية نوع

>>> class X(str):
...     def my_method(self):
...         return int(self)
...
>>> s = X("Hi Mom")
>>> s.lower()
'hi mom'
>>> s.my_method()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 3, in my_method
ValueError: invalid literal for int() with base 10: 'Hi Mom'

>>> z = X("271828")
>>> z.lower()
'271828'
>>> z.my_method()
271828

نصائح أخرى

وطريقة واحدة يمكن أن يكون لاستخدام "الطبقة إعادة فتح" مفهوم (الموجودة أصلا في روبي) التي يمكن تنفيذها في بيثون باستخدام الديكور الطبقة. يتم إعطاء exemple في هذه الصفحة: http://www.ianbicking.org/blog/2007/08/opening-python- classes.html

وأنا أقتبس:

وأعتقد مع الديكور درجة التي يمكن أن تفعل هذا:

@extend(SomeClassThatAlreadyExists)
class SomeClassThatAlreadyExists:
    def some_method(self, blahblahblah):
        stuff

ونفذت مثل هذا:

def extend(class_to_extend):
    def decorator(extending_class):
        class_to_extend.__dict__.update(extending_class.__dict__)
        return class_to_extend
    return decorator

وعلى افتراض أنه لا يمكنك تغيير الطبقات مدمج. لمحاكاة "الطبقة إعادة فتح" مثل روبي في Python3 حيث __dict__ هو كائن mappingproxy وجوه لا ديكت:

def open(cls):
  def update(extension):
    for k,v in extension.__dict__.items():
      if k != '__dict__':
        setattr(cls,k,v)
    return cls
  return update


class A(object):
  def hello(self):
    print('Hello!')

A().hello()   #=> Hello!

#reopen class A
@open(A)
class A(object):
  def hello(self):
    print('New hello!')
  def bye(self):
    print('Bye bye')


A().hello()   #=> New hello!
A().bye()     #=> Bye bye

وأنا يمكن أيضا كتابة وظيفة الديكور 'فتح' وكذلك:

def open(cls):
  def update(extension):
    namespace = dict(cls.__dict__)
    namespace.update(dict(extension.__dict__))
    return type(cls.__name__,cls.__bases__,namespace)
  return update
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top