Bir değişkenin bir sınıf olup olmadığını nasıl kontrol edebilirim?


236

Bir değişkenin bir sınıf (örnek değil!) Olup olmadığını nasıl kontrol edeceğini merak ediyordum.

Bunu isinstance(object, class_or_type_or_tuple)yapmak için işlevi kullanmaya çalıştım , ama bir sınıfın ne tür olacağını bilmiyorum.

Örneğin, aşağıdaki kodda

class Foo: pass  
isinstance(Foo, **???**) # i want to make this return True.

" class" Yerine ??? , ama bunun python'da classbir anahtar kelime olduğunu fark ettim .

Yanıtlar:


335

Daha da iyisi: inspect.isclassişlevi kullanın .

>>> import inspect
>>> class X(object):
...     pass
... 
>>> inspect.isclass(X)
True

>>> x = X()
>>> isinstance(x, X)
True
>>> y = 25
>>> isinstance(y, X)
False

7
inspect.isclassTrueinspect.isclass(type(Myclass()))
Denetlenecek

8
Ne daha iyi :)?
Çılgın Fizikçi

8
@michaelmeyer type(whatever)her zaman sınıf olan bir nesneyi döndürür, bu nedenle bu denetim gereksizdir. Eğer olmasaydı, somutlaştırmanın bir yolu olmazdı whateverve bu yüzden kontrolü ilk etapta gerçekleştiremezdiniz.
a_guest

Benim için çalışmıyor. Snakemake ile python3 kullanma, type(snakemake.utils)döndürür <class 'module'>ve inspect.isclass(snakemake.utils)döndürür False.
tedtoal

3
Çünkü snakemake.utilmodül bir sınıf değil midir?
Benjamin Peterson

44

Inspect.isclass muhtemelen en iyi çözümdür ve aslında nasıl uygulandığını görmek gerçekten kolaydır

def isclass(object):
    """Return true if the object is a class.

    Class objects provide these attributes:
        __doc__         documentation string
        __module__      name of module in which this class was defined"""
    return isinstance(object, (type, types.ClassType))

5
unutmayınimport types
nguyên

13
types.ClassTypeartık Python 3'te gerekli değildir (ve kaldırılmıştır).
kawing-chiu

Bu yeni stil sınıfları ile hiç çalışmaz .... python 2 bile. Bu çözümü yalnız kullanmayın
Erik Aronesty

Bu inceleme modülünden alınmıştır, bu yüzden işe yaramıyor. Örneğin Python2.7 ile kontrol etmek kolaydırIn [8]: class NewStyle(object): ...: pass ...: In [9]: isinstance(NewStyle, (type, types.ClassType)) Out[9]: True
andrea_crotti

Bu, eski stil ve yeni stil sınıflarını işlemek zorunda olan Python 2 uygulamasıdır. Python 3 bunu basitleştirir isinstance(object, type). Nesneler gibi Not olduğunu int, list, strvb vardır da sen ayırt etmek bu kullanamaması için, sınıflar özel sınıflar Python tanımlanan ve yerleşik C kodunda tanımlanan sınıflar .
Martijn Pieters

39
>>> class X(object):
...     pass
... 
>>> type(X)
<type 'type'>
>>> isinstance(X,type)
True

1
Hm ... Güzel cevap, ama Foo sınıfımda (Foo) yazdığımda <type 'type'> yerine <type 'classobj'> yazıyor. Farklılığın, X'in nesneden miras aldığı gerçeğinden geldiğini varsayıyorum, ancak Foo değil. Bundan kaynaklanan başka bir fark var mı? Teşekkürler.
jeeyoungk

6
Eski tarz sınıflar için çalışmaz:, 'class Old:pass' 'isinstance(Old, type) == False'ama inspect.isclass(Old) == True.
jfs

1
@jeeyoungk: "Farkın nereden geldiğini varsayıyorsun ..." değil, aslında bunu kodda okuyorsun. Nesnenin bir alt sınıfı ("yeni stil"), burada gördüğünüz gibi istenen özelliklere sahiptir.
S.Lott

12
İşte ipucu - bu yeni stil sınıfları için işe yaradığından, eski stil sınıflarını kullanmayın. Eski tarz sınıfları kullanmanın bir anlamı yok.
S.Lott

isinstance (e, f) E somutlaştırılmış nesnedir, F sınıf nesnesidir.
Dexter

24
isinstance(X, type)

Dönüş Trueise Xsınıftır ve Falsedeğilse.


3
X bir sınıf olsa bile yanlış anladım.
Mads Skjern

6
Bu sadece yeni stil sınıfları için geçerlidir. Eski stil sınıfları 'classobj' türündedir. Eski stil sınıfları kullanıyorsanız şunları yapabilirsiniz: import types isinstance (X, types.ClassType)
Charles L.

2
Bu S. Lott's answer, dört yaşında olanla aynı görünüyor .
Ethan Furman

5

Bu kontrol hem Python 2.x hem de Python 3.x ile uyumludur.

import six
isinstance(obj, six.class_types)

Bu temelde andrea_crotti cevabı ile aynı kontrolü yapan bir sarıcı fonksiyonudur.

Misal:

>>> import datetime
>>> isinstance(datetime.date, six.class_types)
>>> True
>>> isinstance(datetime.date.min, six.class_types)
>>> False


1

En basit yol, inspect.isclassen çok oy verilen cevapta yayınlandığı gibi kullanmaktır .
uygulama ayrıntıları python2 denetleme ve python3 denetleme bulunabilir .
yeni stil sınıfı için: isinstance(object, type)
eski stil sınıfı için: isinstance(object, types.ClassType)
em, eski stil sınıfı için kullanıyor types.ClassType, İşte types.py kodu :

class _C:
    def _m(self): pass
ClassType = type(_C)

1

Benjamin Peterson inspect.isclass()bu işin kullanımı konusunda haklı. Ancak , yerleşik işlev issubclass işlevini kullanarak bir Classnesnenin belirli Classve dolayısıyla dolaylı olarak a olup olmadığını test edebileceğinizi unutmayın . Kullanım durumunuza bağlı olarak bu daha pitonik olabilir.Class

from typing import Type, Any
def isclass(cl: Type[Any]):
    try:
        return issubclass(cl, cl)
    except TypeError:
        return False

Daha sonra şu şekilde kullanılabilir:

>>> class X():
...     pass
... 
>>> isclass(X)
True
>>> isclass(X())
False

-2

Burada zaten bazı çalışma çözümleri var, ama burada başka bir çözüm var:

>>> import types
>>> class Dummy: pass
>>> type(Dummy) is types.ClassType
True

types.ClassTypePython 3'te kaldırıldı
Beau Barker
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.