2017-02-11 40 views
0

У меня есть класс, содержащий методы и конструктор в Python. Возвращаемое значение конструктора будет объектом, но мне нужно возвращаемое значение класса (конструктора), такого как numbers.Number.Как изменить Суперкласс объекта?

Можно ли изменить возвращаемое значение класса, добавив numbers.Number в качестве суперкласса этого класса, и если да, может кто-нибудь описать, как это сделать?


class Num(Parent): 
    #Some Code 
    #Here Parent must be inherited 

class Foo(Num): 
    #Foo Should return of type numbers.Number 
    #Here Num must be inherited 

Теперь я хочу Foo вернуть number.Number значение, когда мы называем конструктор Foo.

+3

Ваш класс завод не должен иметь номера. Число в качестве базового класса для создания объектов этого типа. Он может просто иметь метод, который создает объекты этого типа и возвращает их. Может быть, я что-то упустил. –

+0

Конструкторы в Python ничего не возвращают. К тому моменту, когда они называются экземпляром класса какого-либо типа, уже существует-конструктор, требуется выполнить любую дальнейшую инициализацию. Возможно, вы сможете сделать то, что хотите, переопределив метод '__new __()', который определяет тип создаваемого объекта. В качестве альтернативы вам может понадобиться что-то, иногда описываемое как «виртуальный конструктор», - так и искать этот термин. Если у вас есть какой-то фактический код в вашем вопросе, иллюстрирующий то, что вы пытаетесь сделать, вы можете улучшить (или, по крайней мере, более конкретные) ответы. – martineau

+0

@martineau, возможно, вы на правильном пути, можете ли вы уточнить, что с данным кодом, который я рассматривал? – Meet

ответ

0

Я не уверен, что вы пытаетесь достичь, делая это, ни то, что вы ожидаете, чтобы это произошло в результате. Однако, поскольку numbers.Number - это abc (абстрактный базовый класс), это означает, что вы можете сделать свой собственный класс одним из своих подклассов, просто зарегистрировав его с помощью abc. (Там нет необходимости переопределять __new__ как я сначала подумал, потому что я не понимал, что numbers.Number был abc.)

Вот что я имею в виду:

import numbers 

class Parent(object): 
    # Added only to make script runnable 
    pass 

class Num(Parent): 
    #Some Code 
    #Here Parent must be inherited 
    pass 

class Foo(Num): 
    #Foo Should return of type numbers.Number 
    #Here Num must be inherited 
    pass 

numbers.Number.register(Foo) 

foo = Foo() 
print(isinstance(foo, numbers.Number)) # -> True 
+0

'numbers.Number.register (Foo) 'генерирует ошибку с сообщением' AttributeError: type object 'Number' не имеет атрибута 'register' ' – Meet

+0

Код в моем ответе выполняется без ошибок для меня как в Python 2.7.13, так и в Python 3.6.0, поэтому я не знаю, в чем проблема. – martineau

0

Это можно сделать по стандарту class inheritance.

from numbers import Number 

class MyNumber(Number): 
    def is_number(self): 
     return isinstance(a, Number) 

a = MyNumber() 
print(a.is_number()) 

Следует отметить, что все классы numbers module являются Abstract Base Classes (азбука) и не может быть создан. Они аналогичны интерфейсам на других языках (например, Java) и реализуются в соответствующих типах, например. int инвентарь numbers.Integral.

Используя numbers.Number в качестве базового класса, вы будете иметь все операции из этого класса в MyNumber, но если вы его экземпляр со значением, как MyNumber(2) вы получите TypeError: object() takes no parameters.

+1

Поскольку [этот раздел] (https://www.python.org/dev/peps/pep-3141/#numeric-classes) в PEP 3141 для модуля 'numbers' говорит, что абстрактный класс' Number' не предоставляет никаких операций, казалось бы, что наследование «всех операций» от него несколько бессмысленно. Как я писал в своем собственном ответе, непонятно, чего надеется OP, выполняя то, что они просят. – martineau

+0

Согласен, вопрос неясен, и мой ответ действительно удовлетворяет только основному требованию того, что ОП задал, будучи в основном бесполезным. – metame

0

Может быть, вы должны наследовать от целого типа:

class MyClass(int): 
    ....