python - online - একটি বস্তুর ধরন নির্ধারণ?



python programming pdf (6)

পাইথন বস্তুর ধরন নির্ধারণ করুন

টাইপ সঙ্গে একটি বস্তুর ধরন নির্ধারণ করুন

>>> obj = object()
>>> type(obj)
<class 'object'>

যদিও এটি কাজ করে তবে __class__ মত ডবল আন্ডারস্কোর বৈশিষ্ট্যগুলি __class__ - তারা শব্দগতভাবে জনসাধারণের নয়, এবং সম্ভবত এই ক্ষেত্রে না থাকলে বিল্টিন ফাংশনগুলি সাধারণত ভাল আচরণ করে।

>>> obj.__class__ # avoid this!
<class 'object'>

টাইপ চেক

একটি পরিবর্তনশীল একটি তালিকা, অভিধান, বা অন্য কিছু নির্ধারণ করতে একটি সহজ উপায় আছে? আমি একটি বস্তুর ফিরে পেয়েছি যেটি হতে পারে এবং আমি পার্থক্য বলতে সক্ষম হতে হবে।

ওয়েল এটি একটি ভিন্ন প্রশ্ন, টাইপ ব্যবহার করবেন না - ব্যবহার 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)

এই ক্ষেত্রে আপনার ব্যবহারকারী লিকভভ সাবস্টিটিউশন নীতি অনুসারে str -subclassing দ্বারা চতুর বা বুদ্ধিমান কিছু করতে পারে সেটি জুড়ে দেয়, আপনি আপনার কোড ভঙ্গ ছাড়াই উপশ্রেণী উদাহরণগুলি ব্যবহার করতে সক্ষম হতে চান - এবং isinstance সমর্থন করে।

Abstractions ব্যবহার করুন

এমনকি ভাল, আপনি collections বা 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)

অথবা শুধু স্পষ্টভাবে টাইপ চেক করবেন না

অথবা, সম্ভবত সর্বোপরি, হাঁস-টাইপিং ব্যবহার করুন এবং আপনার কোডটি স্পষ্টভাবে টাইপ করুন না। হাঁস-টাইপিং আরো সুন্দরতা এবং কম verbosity সঙ্গে Liskov প্রতিস্থাপন সমর্থন করে।

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)

উপসংহার

  • আসলে একটি উদাহরণ এর ক্লাস পেতে type ব্যবহার করুন।
  • প্রকৃত subclasses বা নিবন্ধিত abstractions জন্য স্পষ্টভাবে চেক করার জন্য isinstance ব্যবহার করুন।
  • এবং এটি জ্ঞান করে যেখানে টাইপ চেক এড়ানোর।

https://ffff65535.com

একটি পরিবর্তনশীল একটি তালিকা, অভিধান, বা অন্য কিছু নির্ধারণ করতে একটি সহজ উপায় আছে? আমি একটি বস্তুর ফিরে পেয়েছি যেটি হতে পারে এবং আমি পার্থক্য বলতে সক্ষম হতে হবে।


instinstance ব্যবহার করে সতর্কতা অবলম্বন করা

isinstance(True, bool)
True
>>> isinstance(True, int)
True

কিন্তু টাইপ করুন

type(True) == bool
True
>>> type(True) == int
False

আপনি type() ব্যবহার করে এটি করতে পারেন:

>>> a = []
>>> type(a)
<type 'list'>
>>> f = ()
>>> type(f)
<type 'tuple'>

একটি বস্তুর ধরন পেতে, আপনি অন্তর্নির্মিত type() ফাংশন ব্যবহার করতে পারেন। একটি বস্তুকে একমাত্র প্যারামিটার হিসেবে প্রেরণ করলে সেই বস্তুর টাইপ অবজেক্টটি ফেরত আসবে:

>>> type([]) is list
True
>>> type({}) is dict
True
>>> type('') is str
True
>>> type(0) is int
True
>>> type({})
<type 'dict'>
>>> type([])
<type 'list'>

অবশ্যই এই কাস্টম ধরনের জন্য কাজ করে:

>>> class Test1 (object):
        pass
>>> class Test2 (Test1):
        pass
>>> a = Test1()
>>> b = Test2()
>>> type(a) is Test1
True
>>> type(b) is Test2
True

মনে রাখবেন যে type() শুধুমাত্র বস্তুর তাত্ক্ষণিক টাইপ ফিরিয়ে দেবে, তবে টাইপ উত্তরাধিকার সম্পর্কে আপনাকে বলতে পারবে না।

>>> type(b) is Test1
False

যে আবরণ, আপনি isinstance ফাংশন ব্যবহার করা উচিত। অবশ্যই এই অন্তর্নির্মিত ধরনের জন্য কাজ করে:

>>> isinstance(b, Test1)
True
>>> isinstance(b, Test2)
True
>>> isinstance(a, Test1)
True
>>> isinstance(a, Test2)
False
>>> isinstance([], list)
True
>>> isinstance({}, dict)
True

isinstance() সাধারণত একটি বস্তুর ধরন নিশ্চিত করার জন্য পছন্দের উপায় কারণ এটি উদ্ভূত ধরনের গ্রহণ করা হবে। তাই যদি আপনি আসলে টাইপ অবজেক্ট (যাই হোক না কেন কারণে) প্রয়োজন হয়, isinstance() ব্যবহার করে type() পছন্দ করা হয়।

isinstance() এর দ্বিতীয় প্যারামিটারটিও isinstance() ধরণের গ্রহণ করে, তাই একবারে একাধিক প্রকারের জন্য এটি পরীক্ষা করা সম্ভব। isinstance তখনই সত্য হয়ে যাবে, যদি বস্তুটি যে কোনও ধরণের হয় তবে:

>>> isinstance([], (tuple, list, set))
True

পূর্ববর্তী উত্তরগুলি সরাইয়া রাখার জন্য, collections.abc এর অস্তিত্ব উল্লেখযোগ্য। এর মধ্যে অনেকগুলি বিমূর্ত বেস ক্লাস (ABC) রয়েছে যা হাঁসের-টাইপিংয়ের পরিপূরক।

উদাহরণস্বরূপ, এর সাথে একটি তালিকা আছে কিনা তা স্পষ্টভাবে যাচাই করার পরিবর্তে:

isinstance(my_obj, list)

যদি আপনি আইটেমটি পেতে আইটেমটি পেতে সক্ষম হবেন তবে কেবল আপনি দেখতে আগ্রহী হন, collections.abc.Sequence .abc.equequence ব্যবহার করুন:

from collections.abc import Sequence
isinstance(my_obj, Sequence) 

যদি আপনি বস্তুগুলি সন্ধান, সেটিং এবং মুছে ফেলার অনুমতি দেয় এমন বস্তুগুলিতে কঠোরভাবে আগ্রহী হন তবে আপনি collections.abc.MutableSequence .abc.MutableSequence নির্বাচন করতে চান।

অনেকগুলি এবিসি সেখানে সংজ্ঞায়িত করা হয়েছে, Mapping জন্য ব্যবহার করা যেতে পারে যা ম্যাপ, Iterable , Callable , ইত্যাদি হিসাবে ব্যবহার করা যেতে পারে। Collections.abc এর জন্য ডকুমেন্টেশনে এই সমস্তগুলির একটি সম্পূর্ণ তালিকা দেখা যেতে পারে


বস্তুর দৃষ্টান্তগুলিতে আপনারও রয়েছে:

__class__

বৈশিষ্ট্যাবলী। পাইথন 3.3 কনসোল থেকে নেওয়া একটি নমুনা এখানে

>>> str = "str"
>>> str.__class__
<class 'str'>
>>> i = 2
>>> i.__class__
<class 'int'>
>>> class Test():
...     pass
...
>>> a = Test()
>>> a.__class__
<class '__main__.Test'>

পাইথন 3.x এবং নিউ স্টাইল ক্লাসগুলিতে (পিয়থন ২6 থেকে বিকল্প বিকল্প) শ্রেণিবদ্ধ এবং টাইপ মার্জ করা হয়েছে এবং এটি মাঝে মাঝে অপ্রত্যাশিত ফলাফল হতে পারে তা সাবধান। প্রধানত এই কারণে পরীক্ষার ধরন / ক্লাস আমার প্রিয় উপায় ফাংশন নির্মিত isinstance হয়।





python