Имея тип python 2.7.2, есть ли способ создать экземпляр класса программно? - PullRequest
1 голос
/ 29 февраля 2012
class MType(type):
 pass

class MClass(object):
 __metaclass__ = MType

a = MType

Из приведенного выше фрагмента в любом случае я могу создать экземпляр MClass с учетом a?

(вероятно, важно отметить, что я не смогу просто создать MClass())

Ответы [ 3 ]

2 голосов
/ 29 февраля 2012

Вот ужасный способ сделать это. Хотя, если честно, я не уверен, в чем разница между установкой __metaclass__ в качестве свойства модуля и наследованием.

class MType(type):
    pass

class MClass(MType):
    pass

a = MType

print a.__mro__[0].__subclasses__(a)

Урожайность:

[<class '__main__.MClass'>]
0 голосов
/ 29 февраля 2012

Есть два простых способа найти экземпляры метакласса. Один из них заключается в том, чтобы метакласс отслеживал список своих экземпляров по мере их создания следующим образом:

class MType(type):
    instances = []    #list of instances of the metaclass

    def __init__(cls, name, bases, dct):
            MType.instances.append(cls)    #append to list of instances
            super(MType, cls).__init__(name, bases, dct)

class MClass(object):
    __metaclass__ = MType

Теперь MType.instances - это [<class '__main__.MClass'>].

Другой способ - использовать осмотрите модуль , чтобы просмотреть классы, скажем, в данном модуле, и используйте isinstance, чтобы проверить, являются ли они экземплярами MType. Это не обязательно сумасшедшая вещь - например, различные комплекты модульного тестирования работают, просматривая модуль для классов и функций, которые кажутся тестами, основанными на их именах и / или унаследованных классах - я не но я действительно уверен, почему вы захотите сделать это с метаклассом.

0 голосов
/ 29 февраля 2012

Нет, если у вас есть b = MClass, вы можете просто сделать obj = b(), но метакласс не «знает» о классе (ах), для которого он установлен как метакласс.

Вы можете вызвать __new__ на a, если у вас есть класс в переменной, будь то b или MClass.

...