Почему я не могу наследовать от dict и исключения в Python?

Поскольку мы не циклически перемещаем оба итератора (num1 и num2) в одно и то же время, первое найденное нами число палиндрома будет самым большим. Нам не нужно проверять, является ли найденный нами палиндром самым большим. Это значительно сокращает время, необходимое для расчета.

package testing.project;
public class PalindromeThreeDigits {
    public static void main(String[] args) {

    int limit = 99;
    int max = 999;
    int num1 = max, num2, prod;

    while(num1 > limit)
    {
        num2 = num1;
        while(num2 > limit)
        {
            total = num1 * num2;
            StringBuilder sb1 = new StringBuilder(""+prod);
            String sb2 = ""+prod;
            sb1.reverse();
            if( sb2.equals(sb1.toString()) ) {    //optimized here
                //print and exit
            }
            num2--;
        }
        num1--;
    }

 }//end of main
 }//end of class PalindromeThreeDigits
18
задан e-satis 21 November 2008 в 15:49
поделиться

5 ответов

Оба Exception и dict реализованы в C.

Я думаю, что можно протестировать это follwing путь:

>>> class C(object): pass
...
>>> '__module__' in C.__dict__
True
>>> '__module__' in dict.__dict__
False
>>> '__module__' in Exception.__dict__
False

С тех пор Exception и dict имейте различные идеи того, как хранить их данные внутренне, они не совместимы, и таким образом Вы не можете наследоваться от обоих одновременно.

В более поздних версиях Python необходимо получить Исключение момент, Вы пытаетесь определить класс:

>>> class foo(dict, Exception):
...     pass
... 
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: Error when calling the metaclass bases
    multiple bases have instance lay-out conflict
21
ответ дан 30 November 2019 в 07:56
поделиться

Какая версия Python?

В 2.5.1, я не могу даже определить класс наследовать от обоих dict и Exception:

>>> class foo(dict, Exception):
...   pass
... 
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: Error when calling the metaclass bases
    multiple bases have instance lay-out conflict

При использовании более старой версии возможно, она не делает, эта проверка во время определения типа и конфликт вызывают причуды позже.

3
ответ дан 30 November 2019 в 07:56
поделиться

Никакая причина, но решение

В настоящий момент я все еще не знаю, почему, но я обхожу его использование UserDict.UserDict. Это медленнее, так как это - чистый Python, но я не думаю на этой части приложения, это будет неприятно.

Все еще заинтересованный об ответе так или иначе ;-)

3
ответ дан 30 November 2019 в 07:56
поделиться

Что случилось с этим?

class ConstraintFailure( Exception ):
    def __init__( self, **failures ):
        self.failures= failures # already a dict, don't need to do anything
    def __getitem__( self, key ):
        return self.failures.get(key)

Это - Исключение, и оно содержит другие исключения во внутреннем названном словаре failures.

Вы могли обновить свою проблему для списка немного некоторая определенная вещь, которую это не может сделать?

try:
    raise ConstraintFailure( x=ValueError, y=Exception )
except ConstraintFailure, e:
    print e['x']
    print e['y']


<type 'exceptions.ValueError'>
<type 'exceptions.Exception'>
4
ответ дан 30 November 2019 в 07:56
поделиться

Я почти уверен, что с версией 2.4 проблема вызвана исключениями, которые являются классами старого стиля.

$ python2.4
Python 2.4.4 (#1, Feb 19 2009, 09:13:34)
>>> type(dict)
<type 'type'>
>>> type(Exception)
<type 'classobj'>
>>> type(Exception())
<type 'instance'>

$ python2.5
Python 2.5.4 (r254:67916, Feb 17 2009, 23:11:16)
>>> type(Exception)
<type 'type'>
>>> type(Exception())
<type 'exceptions.Exception'>

В обеих версиях, как говорится в сообщении, исключения могут быть классами, экземплярами (классов старого стиля) или строки (не рекомендуется).

Начиная с версии 2.5 иерархия исключений, наконец, основана на новых классах стилей. И экземпляры новых классов стилей, которые наследуются от BaseException, теперь также разрешены. Но в 2.4 множественное наследование от Exception (класс старого стиля) и dict (класс нового стиля) приводит к новому классу стиля, который не допускается как исключение (смешивание старого и нового классов стиля, вероятно, в любом случае плохо).

0
ответ дан 30 November 2019 в 07:56
поделиться
Другие вопросы по тегам:

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