2016-02-17 2 views
0

У меня есть аналогичный код. Не очень, но я не стану много, но мне нужно, чтобы check_type принял параметр r_type как строку и проверить, имеет ли тип объекта значение этой строки. Это выполнимо?!?!?Как сделать общий тип проверки в python

я повторить не могу этого сделать: n.check_type (r_type = Новее) *, мне нужно взять r_type значение из файла конфигурации и Thats способ является строкой!

class New(object): 
     def check_type(self, r_type): 
      print 'is instance of r_type: ', isinstance(self, r_type) 
      return isinstance(self, r_type) 

    class Newer(New): 
     pass 

    if __name__ == '__main__': 
     n = Newer() 
     n.check_type(r_type='Newer') 

Выход:

 print 'is instance of r_type: ', isinstance(self, r_type) 
    TypeError: isinstance() arg 2 must be a class, type, or tuple of classes and types 
+0

Это принято принимать ответы, которые помогут вам, нажав на галочку рядом с ними , Я вижу, вы еще этого не обнаружили - если вы хотите продолжить получать хорошую помощь здесь, вам нужно ее найти :) – GreenAsJade

ответ

0

Вместо того, чтобы позвонить isInstance, вы могли бы просто сравнить имена типов непосредственно:

class New(object): 
    def check_type(self, r_type): 
     return str(type(self)) == r_type 

class Newer(New): 
    pass 

if __name__ == '__main__': 
    n = Newer() 
    print n.check_type(r_type="<class '__main__.Newer'>") 

Очевидно, что вы можете для создания имени типа, чтобы извлечь только базовое имя типа и сравнить это, для удобства указав :)

3

вы можете использовать global словарь, чтобы получить фактический класс по его имени и использовать его, чтобы проверить с isinstance

>>> class New(object): 
     def check_type(self,r_type): 
      result = isinstance(self,globals()[r_type]) 
      print "is instance of r_type: ",result 
      return result 


>>> class Newer(New): 
     pass 

>>> n=Newer() 
>>> n.check_type("Newer") 
is instance of r_type: True 
True 
>>> 
+0

Мне нравится ваш лучше :) – GreenAsJade