কীভাবে সেই অ্যাট্রিবিউটের নামের সাথে সম্পর্কিত স্ট্রিমের অবজেক্ট অ্যাট্রিবিউট অ্যাক্সেস করবেন


153

আপনি tপ্রদত্ত বৈশিষ্ট্যের মানগুলি কীভাবে সেট করবেন / পাবেন x?

class Test:
   def __init__(self):
       self.attr1 = 1
       self.attr2 = 2

t = Test()
x = "attr1"

উত্তর:


284

বলা হয় অন্তর্নির্মিত ফাংশন getattrএবংsetattr

getattr(object, attrname)
setattr(object, attrname, value)

এক্ষেত্রে

x = getattr(t, 'attr1')
setattr(t, 'attr1', 21)

12
অ্যাট্রিবিউটস মোছার জন্য ডিলেটটারও রয়েছে তবে এটি খুব কমই ব্যবহৃত হয়।
ডেভ কার্বি

11
এবং কোনও বস্তুর নির্দিষ্ট অ্যাটর রয়েছে কিনা তা পরীক্ষার জন্য হ্যাশট্র যদিও এই ক্ষেত্রে তিনটি আর্গুমেন্ট ফর্ম গ্যাটট্রা (অবজেক্ট, অ্যাটারনেম, ডিফল্ট) ব্যবহার করা প্রায়শই ভাল।
ডানকান

যাইহোক আমরা কি এইভাবে getattr ব্যবহার করতে পারি এবং বলতে পারি যে আমার কাছে একটি ডেটাফ্রেম আছে df1, এবং ভেরিয়েবল x = 'df1'অর্থাৎ df1 ভার্জ x এর স্ট্রিং হিসাবে। আমি df এর মতো আকারটি প্রিন্ট করতে চাই, getattr(x, 'shape')বা getattr('df1', 'shape')। আমি জানি গ্যাটট্রা, অন্য কোনও পদ্ধতিতে এটি করা যায় না।
ihightower

3

দ্রষ্টব্য: এই উত্তরটি খুব পুরানো। এটা তোলে পাইথন 2 প্রযোজ্য ব্যবহার newমডিউল ছিল 2008 সালে অবচিত

ফাংশনস সেটেট্র এবং গেটআটারে অজগরটি নির্মিত। যা শ্রেণীর বৈশিষ্ট্য নির্ধারণ এবং পেতে ব্যবহার করতে পারে।

সংক্ষিপ্ত উদাহরণ:

>>> from new import  classobj

>>> obj = classobj('Test', (object,), {'attr1': int, 'attr2': int}) # Just created a class

>>> setattr(obj, 'attr1', 10)

>>> setattr(obj, 'attr2', 20)

>>> getattr(obj, 'attr1')
10

>>> getattr(obj, 'attr2')
20

0

আপনি যদি ক্লাসের ভিতরে লজিকটি গোপন রাখতে চান তবে আপনি সাধারণ জেটর পদ্ধতিটি এর মতো ব্যবহার করতে পছন্দ করতে পারেন:

class Test:
    def __init__(self):
        self.attr1 = 1
        self.attr2 = 2

    def get(self,varname):
        return getattr(self,varname)

t = Test()
x = "attr1"
print ("Attribute value of {0} is {1}".format(x, t.get(x)))

আউটপুট:

Attribute value of attr1 is 1

এটি আরও ভালভাবে আড়াল করতে পারে এমন আরেকটি অ্যাপোচারটি যাদু পদ্ধতিটি ব্যবহার করা হবে __getattribute__, তবে আমি একটি অন্তহীন লুপ পেতে থাকি যা সেই পদ্ধতির অভ্যন্তরে গুণাবলীটি পুনরুদ্ধার করার চেষ্টা করার সময় আমি সমাধান করতে পারি না।

এছাড়াও লক্ষ করুন যে আপনি বিকল্পভাবে ব্যবহার করতে পারেন vars()। উপরের উদাহরণে, আপনি বিনিময় হতে পারে getattr(self,varname)দ্বারা return vars(self)[varname], কিন্তু getattrউত্তর অনুযায়ী বাঞ্ছনীয় হতে পারে কি মধ্যে পার্থক্য varsএবং setattr?

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.