توسيع بنيت في الطبقات في بيثون
-
20-08-2019 - |
سؤال
وكيف يمكنني توسيع فئة مدمج في بيثون؟
وأود أن أضيف طريقة إلى فئة شارع.
لقد فعلت بعض البحث ولكن كل أنا وجدت من المشاركات القديمة، وأنا على أمل شخص يعرف شيء أحدث.
المحلول
وفقط فئة فرعية نوع
>>> 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
لا تنتمي إلى StackOverflow