Python nesnesinin türünü belirleme
İle bir nesnenin türünü belirleme type
>>> obj = object()
>>> type(obj)
<class 'object'>
Çalışmasına rağmen, __class__
semantik olarak herkese açık olmayan çift alt çizgi özelliklerinden kaçının ve belki de bu durumda olmasa da yerleşik işlevler genellikle daha iyi davranışa sahiptir.
>>> obj.__class__ # avoid this!
<class 'object'>
tip kontrolü
Bir değişkenin liste, sözlük veya başka bir şey olup olmadığını belirlemenin basit bir yolu var mı? Ben her iki tip olabilir bir nesne geri alıyorum ve farkı söyleyebilmek gerekir.
Bu farklı bir soru, türü kullanma - kullan isinstance
:
def foo(obj):
"""given a string with items separated by spaces,
or a list or tuple,
do something sensible
"""
if isinstance(obj, str):
obj = str.split()
return _foo_handles_only_lists_or_tuples(obj)
Bu str
, Liskov İkame ilkesine göre, alt sınıf örneklerini kodunuzu kırmadan kullanabilmeniz için, alt sınıflama ile kullanıcılarınızın akıllı veya mantıklı bir şey yapıyor olabileceği durumu kapsar ve bunu isinstance
destekler.
Soyutlamaları Kullan
Daha da iyisi, aşağıdakilerden collections
veya belirli bir Özet Temel Sınıfı arayabilirsiniz numbers
:
from collections import Iterable
from numbers import Number
def bar(obj):
"""does something sensible with an iterable of numbers,
or just one number
"""
if isinstance(obj, Number): # make it a 1-tuple
obj = (obj,)
if not isinstance(obj, Iterable):
raise TypeError('obj must be either a number or iterable of numbers')
return _bar_sensible_with_iterable(obj)
Veya Açıkça Yazmayın
Ya da belki de en iyisi, ördek yazmayı kullanın ve kodunuzu açıkça yazmayın. Ördek yazma, daha şık ve daha az ayrıntı ile Liskov İkame özelliğini destekler.
def baz(obj):
"""given an obj, a dict (or anything with an .items method)
do something sensible with each key-value pair
"""
for key, value in obj.items():
_baz_something_sensible(key, value)
Sonuç
type
Bir örneğin sınıfını almak için kullanın .
isinstance
Gerçek alt sınıfları veya kayıtlı soyutlamaları açıkça kontrol etmek için kullanın .
- Ve mantıklı olduğu yerde tip kontrolünden kaçının.