আইসি # আমরা প্রতিবিম্বের মাধ্যমে এটি করি। জাভাস্ক্রিপ্টে এটি সহজ:
for(var propertyName in objectName)
var currentPropertyValue = objectName[propertyName];
পাইথনে এটি কীভাবে করবেন?
@property
।
আইসি # আমরা প্রতিবিম্বের মাধ্যমে এটি করি। জাভাস্ক্রিপ্টে এটি সহজ:
for(var propertyName in objectName)
var currentPropertyValue = objectName[propertyName];
পাইথনে এটি কীভাবে করবেন?
@property
।
উত্তর:
for property, value in vars(theObject).iteritems():
print property, ": ", value
সচেতন একটি আছে যে কিছু বিরল ক্ষেত্রে হউন __slots__
সম্পত্তি, এই ধরনের শ্রেণীর প্রায়ই নাই __dict__
।
__setattr__()
। অভিধানে সরাসরি মান সেট করা অবজেক্টের সেটারকে বাইপাস করে (এবং / অথবা এর পিতামাতাদের)। অজগরটিতে এটি বেশ সাধারণ বিষয় যে বৈশিষ্ট্য সেটিংয়ের (যেমন স্যানিটেশন) চলাকালীন চোখের দেখা মিলনের চেয়েও বেশি কিছু ঘটনাসমূহ পটভূমিতে ঘটে থাকে, তা setattr()
নিশ্চিত করে যে আপনি এড়াতে চান না, বা সেগুলি স্পষ্টভাবে নিজেকে পরিচালনা করতে বাধ্য হন।
vars()
কেবল স্থিতিশীল সদস্যদের (যেমন, বস্তুর বৈশিষ্ট্য এবং সেই বস্তুর সাথে নিবন্ধিত পদ্ধতিগুলি __dict__
) ফেরত দেয় । এটি গতিশীল সদস্যদের (যেমন, বস্তুর বৈশিষ্ট্য এবং পদ্ধতিগুলি বস্তুর পদ্ধতি বা অনুরূপ যাদু দ্বারা গতিশীলভাবে সংজ্ঞায়িত ) ফেরত দেয় না । সমস্ত সম্ভাবনায় আপনার পছন্দসই সম্পত্তি গতিশীলভাবে সংজ্ঞায়িত করা হয় এবং তাই বা এগুলি উপলভ্য নয় । __getattr__()
file.ImplementationName
vars()
dir()
দেখুন inspect.getmembers(object[, predicate])
।
নামের সাথে বাছাই করা (নাম, মান) জোড়ার তালিকায় কোনও অবজেক্টের সমস্ত সদস্যকে ফিরিয়ে দিন। যদি alচ্ছিক প্রাকটিকেট যুক্তি সরবরাহ করা হয় তবে কেবলমাত্র সেই সদস্যদের জন্য যার জন্য ভবিষ্যদ্বাণীক একটি সত্য মান দেয়।
>>> [name for name,thing in inspect.getmembers([])]
['__add__', '__class__', '__contains__', '__delattr__', '__delitem__',
'__delslice__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__',
'__getitem__', '__getslice__', '__gt__', '__hash__', '__iadd__', '__imul__', '__init__', '__iter__',
'__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__','__reduce_ex__',
'__repr__', '__reversed__', '__rmul__', '__setattr__', '__setitem__', '__setslice__',
'__sizeof__', '__str__', '__subclasshook__', 'append', 'count', 'extend', 'index',
'insert', 'pop', 'remove', 'reverse', 'sort']
>>>
attributes
ব্যবহার করে members
(উভয়ের মধ্যে কোনও পার্থক্য আছে?)। নামটি ধারাবাহিক করতে তারা পাইথন 3.0 এ নামটি স্থির করতে পারত।
__dict__
, দুঃখিত।
inspect.getmembers()
মোড়ানো dir()
) হ্যাঁ, তাই না? তৃতীয় পক্ষের গ্রন্থাগারগুলির জন্য যথাযথভাবে সমস্ত সম্ভাব্য বস্তুর প্রকারকে সমর্থন করা উপযুক্ত। স্ট্যান্ডার্ড ব্যবহারের ক্ষেত্রে, তবে একেবারে যথেষ্ট। inspect.getmembers()
dir()
dir()
সহজ উপায়। এখানে দেখো:
dir()
আপনাকে ধন্যবাদ ভুলে গেছি ।
__dict__
বস্তুর সম্পত্তি সব তার অন্যান্য সংজ্ঞায়িত বৈশিষ্ট্য একটি অভিধান আছে। দ্রষ্টব্য যে পাইথন ক্লাসগুলি getattr ওভাররাইড
করতে পারে এবং এমন বৈশিষ্ট্য তৈরি করতে পারে যা বৈশিষ্ট্যের মতো দেখায় কিন্তু এতে নেই __dict__
। বিল্টিন ফাংশনগুলিও রয়েছে vars()
এবং dir()
যা সূক্ষ্ম উপায়ে পৃথক। এবং কিছু অস্বাভাবিক ক্লাসে __slots__
প্রতিস্থাপন করতে পারেন __dict__
।
পাইথনে বস্তুগুলি জটিল complicated __dict__
প্রতিবিম্ব-স্টাইল প্রোগ্রামিংয়ের জন্য শুরু করার সঠিক জায়গা। dir()
আপনি যদি একটি ইন্টারেক্টিভ শেলের চারপাশে হ্যাক করছেন তবে এটি শুরু করার জায়গা।
print vars.__doc__
ইঙ্গিত দেয় যে With an argument, equivalent to object.__dict__
সূক্ষ্ম পার্থক্য কি হবে?
জর্জি স্কোলি সংক্ষিপ্ত সংস্করণ
print vars(theObject)
আপনি যদি সমস্ত বৈশিষ্ট্যের প্রতিচ্ছবি সন্ধান করেন তবে উপরের উত্তরগুলি দুর্দান্ত।
যদি আপনি কেবল অভিধানের কীগুলি (যা পাইথনের কোনও 'অবজেক্ট' থেকে পৃথক) পাওয়ার সন্ধান করে থাকেন তবে ব্যবহার করুন
my_dict.keys()
my_dict = {'abc': {}, 'def': 12, 'ghi': 'string' }
my_dict.keys()
> ['abc', 'def', 'ghi']
obj['key']
বনাম obj.property
) এবং প্রশ্নটি ছিল বস্তুর বৈশিষ্ট্য সম্পর্কে। আমি আমার উত্তর এখানে রেখেছি কারণ দুজনের মধ্যে সহজেই বিভ্রান্তি রয়েছে।
এটি সম্পূর্ণরূপে অন্যান্য উত্তরগুলির সাথে আচ্ছাদিত, তবে আমি এটি স্পষ্ট করে দেব। একটি অবজেক্টের ক্লাস অ্যাট্রিবিউটস এবং স্ট্যাটিক এবং ডায়নামিক ইনস্ট্যান্ট অ্যাট্রিবিউট থাকতে পারে।
class foo:
classy = 1
@property
def dyno(self):
return 1
def __init__(self):
self.stasis = 2
def fx(self):
return 3
stasis
স্থিতিশীল, dyno
গতিশীল (সিএফ। সম্পত্তি সজ্জা) এবং classy
এটি একটি শ্রেণি বৈশিষ্ট্য। আমরা যদি সহজভাবে করি __dict__
বা আমরা কেবল vars
স্থির একটি পাই।
o = foo()
print(o.__dict__) #{'stasis': 2}
print(vars(o)) #{'stasis': 2}
সুতরাং আমরা চাইলে অন্যরা __dict__
সবকিছু (এবং আরও কিছু) পাবে। এর মধ্যে রয়েছে যাদু পদ্ধতি এবং বৈশিষ্ট্য এবং সাধারণ গণ্ডিযুক্ত পদ্ধতি। সুতরাং এগুলি এড়ানো যাক:
d = {k: getattr(o, k, '') for k in o.__dir__() if k[:2] != '__' and type(getattr(o, k, '')).__name__ != 'method'}
print(d) #{'stasis': 2, 'classy': 1, 'dyno': 1}
type
একটি সম্পত্তি সজ্জিত পদ্ধতি (একটি গতিশীল বৈশিষ্ট্য) সঙ্গে বলা তোমরা প্রত্যাবর্তিত মানের প্রকার দিতে, হবে না method
। এটি প্রমাণ করার জন্য আসুন জসন এটির স্ট্রিংফাই করুন:
import json
print(json.dumps(d)) #{"stasis": 2, "classy": 1, "dyno": 1}
এটি যদি কোনও পদ্ধতি হত তবে এটি ক্র্যাশ হত।
টি এল; ডিআর। extravar = lambda o: {k: getattr(o, k, '') for k in o.__dir__() if k[:2] != '__' and type(getattr(o, k, '')).__name__ != 'method'}
তিনটি জন্য কল করার চেষ্টা করুন , কিন্তু পদ্ধতি বা জাদু নয়।