Как базовый класс Python может сказать, переопределил ли sub класс свои методы?

IO:: Dir хорош и обеспечивает связанный интерфейс хеша также.

От perldoc:

use IO::Dir;
$d = IO::Dir->new(".");
if (defined $d) {
    while (defined($_ = $d->read)) { something($_); }
    $d->rewind;
    while (defined($_ = $d->read)) { something_else($_); }
    undef $d;
}

tie %dir, 'IO::Dir', ".";
foreach (keys %dir) {
    print $_, " " , $dir{$_}->size,"\n";
}

Таким образом, Вы могли сделать что-то как:

tie %dir, 'IO::Dir', $directory_name;
my @dirs = keys %dir;

7
задан 6 revs, 4 users 99% 22 January 2017 в 15:08
поделиться

2 ответа

Возможно это?

>>> class BaseClass(object):
...     def foo(self):
...         return 'foo'
...     def bar(self):
...         return 'bar'
...     def methods_implemented(self):
...         """This does work."""
...         overriden = []
...         for method in ('foo', 'bar'):
...             this_method = getattr(self, method)
...             base_method = getattr(BaseClass, method)
...             if this_method.__func__ is not base_method.__func__:
...                 overriden.append(method)
...         return overriden
... 
>>> class SubClass(BaseClass):
...     def foo(self):
...         return 'override foo'
... 
>>> o = SubClass()
>>> o.methods_implemented()
['foo']

Это проверяет, совпадают ли объекты функций, стоящие за связанными методами.

Обратите внимание, что до Python 2.6 атрибут __ func __ был с именем im_func .

10
ответ дан 7 December 2019 в 01:22
поделиться

Методы, хотя и вызывают один и тот же объект, НЕ являются одним и тем же объектом. Вы должны проверить, являются ли функции, заключенные в несвязанный метод, одним и тем же объектом.

Здесь я использую 2.6, поэтому я также изменил класс на наследование от объекта.

>>> class BaseClass(object):
...     def foo(self):
...         return 'foo'
...     def bar(self):
...         return 'bar'
...     def methods_implemented(self):
...         """This doesn't work..."""
...         overriden = []
...         for method in ('foo', 'bar'):
...             this_method = getattr(self, method).__func__
...             base_method = getattr(BaseClass, method).__func__
...             if this_method is base_method:
...                 overriden.append(method)
...         return overriden
... 
>>> class SubClass(BaseClass):
...     def foo(self):
...         return 'override foo'
... 
>>> o = SubClass()
>>> o.methods_implemented()
['bar']
0
ответ дан 7 December 2019 в 01:22
поделиться
Другие вопросы по тегам:

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