একটি শ্রেণীর বৈশিষ্ট্য প্রাপ্তি


106

আমি একটি শ্রেণীর বৈশিষ্ট্য পেতে চাই, বলুন:

class MyClass():
  a = "12"
  b = "34"

  def myfunc(self):
    return self.a

ব্যবহার MyClass.__dict__আমাকে বৈশিষ্ট্য এবং ক্রিয়াকলাপ এবং এমনকি মত __module__এবং এর মতো ফাংশনগুলির একটি তালিকা দেয় __doc__। যদিও MyClass().__dict__আমাকে একটি খালি ডিক দেয় যখন না আমি স্পষ্ট করে instance দৃষ্টান্তটির একটি বৈশিষ্ট্য মান সেট করি।

আমি কেবল বৈশিষ্ট্যগুলি চাই, উপরের উদাহরণে সেগুলি হবে: aএবংb


উত্তর:


123

পরিদর্শন মডিউল চেষ্টা করুন । getmembersএবং বিভিন্ন পরীক্ষা সহায়ক হতে হবে।

সম্পাদনা করুন:

উদাহরণ স্বরূপ,

class MyClass(object):
    a = '12'
    b = '34'
    def myfunc(self):
        return self.a

>>> import inspect
>>> inspect.getmembers(MyClass, lambda a:not(inspect.isroutine(a)))
[('__class__', type),
 ('__dict__',
  <dictproxy {'__dict__': <attribute '__dict__' of 'MyClass' objects>,
   '__doc__': None,
   '__module__': '__main__',
   '__weakref__': <attribute '__weakref__' of 'MyClass' objects>,
   'a': '34',
   'b': '12',
   'myfunc': <function __main__.myfunc>}>),
 ('__doc__', None),
 ('__module__', '__main__'),
 ('__weakref__', <attribute '__weakref__' of 'MyClass' objects>),
 ('a', '34'),
 ('b', '12')]

এখন, আমার স্নায়ুগুলির জন্য বিশেষ পদ্ধতি এবং বৈশিষ্ট্যগুলি পাওয়া যায় those সেগুলি বিভিন্ন উপায়ে মোকাবেলা করা যেতে পারে, যার মধ্যে সবচেয়ে সহজ নাম অনুসারে ফিল্টার করা।

>>> attributes = inspect.getmembers(MyClass, lambda a:not(inspect.isroutine(a)))
>>> [a for a in attributes if not(a[0].startswith('__') and a[0].endswith('__'))]
[('a', '34'), ('b', '12')]

... এবং আরও জটিল যেগুলির মধ্যে বিশেষ গুণাবলী নাম চেক বা এমনকি মেটাক্লাসগুলি অন্তর্ভুক্ত থাকতে পারে;)


হ্যাঁ এই দুর্দান্ত! আমি এটি ব্যবহার করেছি: attributes = inspect.getmembers(MyClass, lambda a:not(inspect.isroutine(a))) print [a[0] for a in attributes if '_' not in a[0]]
মোহাম্মদ খামিস

2
সাবধান! যে বৈশিষ্ট্য অন্তর্ভুক্ত করা হবে না like_this! এটি "ব্যক্তিগত" বৈশিষ্ট্যগুলিও এড়াতে পারবে, যা আপনি সম্ভবত উদ্দেশ্য করেই করেছেন।
ম্যাট লুঙ্গো

হাই, আমি এটিও একটি সামান্য স্পষ্টির সাথে পছন্দ করেছি: অভিব্যক্তিতে inspect.getmembers(MyClass, ..., MyClassকোনও শ্রেণি বা কোনও বস্তুর দ্বারা প্রতিস্থাপন করা যেতে পারে এবং যদি আপনার অবজেক্টের মানগুলির তালিকা প্রয়োজন হয় তবে আপনাকে অবশ্যই MyClassআপনার অবজেক্ট ভেরিয়েবল দ্বারা প্রতিস্থাপন করতে হবে (বা selfযদি আপনি রাখেন তবে def __repr__()আমার মত পদ্ধতিতে এই অভিব্যক্তি )।
herve-guerin

আমি এটি (পাইথন 3 এ) একটি ফাংশন পেতে ব্যবহার করেছি যা ' ডিক ' মানটির সন্ধান করে: i = inspect.getmembers(MyClass, lambda a:not(inspect.isroutine(a))); z = [_[1] for _ in i if _[0] in '__dict__'][0]এবং তারপরে এটি z থেকে কীগুলি পাওয়ার বিষয়টি মাত্র।
ডাবল0দারবো

42
def props(cls):   
  return [i for i in cls.__dict__.keys() if i[:1] != '_']

properties = props(MyClass)

7
এর মধ্যে পদ্ধতির নামগুলি অন্তর্ভুক্ত থাকবে
lenhhoxung

10
চেক করার জন্য আরও স্পষ্ট হবে না: if not i.startswith('_')পরিবর্তে if i[:1] != '_'?
মিকেলব্লমকভিস্টসন

2
দ্রষ্টব্য: আমরা যদি শিশু শ্রেণির বিষয়ে কথা বলি (উত্তরাধিকারসূত্রে), তবে .__dict__.keys()পিতামাতার কাছ থেকে বৈশিষ্ট্যগুলি অন্তর্ভুক্ত করা হবে না।
vishes_shell

21

myfunc এর একটি বৈশিষ্ট্য MyClass। আপনি দৌড়ানোর সময় এটি কীভাবে পাওয়া যায়:

myinstance = MyClass()
myinstance.myfunc()

এটি myinstanceনামক একটি বৈশিষ্ট্যের সন্ধান করে myfunc, একটি খুঁজে পায় না, এটি myinstanceএকটি উদাহরণ MyClassএবং এটি সেখানে দেখায়।

সুতরাং এর জন্য বৈশিষ্ট্যের সম্পূর্ণ তালিকাটি MyClassহ'ল:

>>> dir(MyClass)
['__doc__', '__module__', 'a', 'b', 'myfunc']

(নোট করুন যে আমি ক্লাসের সদস্যদের তালিকার জন্য দ্রুত এবং সহজ উপায় হিসাবে দিরকে ব্যবহার করছি: এটি কেবল উত্পাদন কোডে নয়, অনুসন্ধানী ফ্যাশনে ব্যবহার করা উচিত)

আপনি শুধুমাত্র নির্দিষ্ট বৈশিষ্ট্য চান, আপনি কিছু বিচার্য বিষয় ব্যবহার করে এই তালিকা ফিল্টার করতে, কারণ প্রয়োজন হবে __doc__, __module__এবং myfuncঅন্য কোন উপায়ে বিশেষ হয় না, তারা বৈশিষ্ট্যাবলী ঠিক একই ভাবে যে abআছে।

আমি কখনই ম্যাট এবং বোরিলিড দ্বারা বর্ণিত পরিদর্শন মডিউলটি ব্যবহার করিনি, তবে একটি সংক্ষিপ্ত লিঙ্ক থেকে দেখে মনে হচ্ছে এটি করার জন্য এটির পরীক্ষাগুলি রয়েছে, তবে আপনার নিজের প্রাকটিক্যাল ফাংশনটি লিখতে হবে, কারণ আপনি যা চান তা মনে হচ্ছে মোটামুটিভাবে চারিত্রিক বৈশিষ্ট্য আছে যেগুলো হয় না পাস isroutineপরীক্ষা শুরু এবং দুই আন্ডারস্কোর দিয়ে শেষ হবে না।

এছাড়াও দ্রষ্টব্য: class MyClass():পাইথন ২.7 এ ব্যবহার করে আপনি পুরানো শৈলীর পুরানো ক্লাসগুলি ব্যবহার করছেন না। আপনি অত্যন্ত পুরানো লাইব্রেরিগুলির সাথে সামঞ্জস্যের জন্য ইচ্ছাকৃতভাবে এমনটি না করলে আপনার পরিবর্তে আপনার ক্লাসটি সংজ্ঞায়িত করা উচিত class MyClass(object):। পাইথন 3 এ কোনও "পুরানো-শৈলী" শ্রেণি নেই, এবং এই আচরণটি ডিফল্ট। যাইহোক, নতুন স্টাইলের ক্লাসগুলি ব্যবহার করা আপনাকে অনেকগুলি স্বয়ংক্রিয়ভাবে সংজ্ঞায়িত বৈশিষ্ট্যগুলি প্রাপ্ত করবে:

>>> class MyClass(object):
        a = "12"
        b = "34"
        def myfunc(self):
            return self.a
>>> dir(MyClass)
['__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'a', 'b', 'myfunc']

6
কেউ এর উপর নির্ভর করতে পারে না dir(): " যেহেতু ডিআর () প্রাথমিকভাবে ইন্টারেক্টিভ প্রম্পটে ব্যবহারের সুবিধার্থ হিসাবে সরবরাহ করা হয়, এটি নামগুলির একটি দৃor় বা ধারাবাহিকভাবে সংজ্ঞায়িত সেট সরবরাহ করার চেষ্টা করার চেয়ে নামের একটি আকর্ষণীয় সেট সরবরাহ করার চেষ্টা করে এবং এর বিশদ বিবরণ দেয় আচরণ রিলিজ জুড়ে পরিবর্তিত হতে পারে "(দেখুন ডকুমেন্টেশনdir() )।
টেডেক

@ টেডেক: ভালো কথা। সমাধান হিসাবে প্রস্তাব দেওয়ার পরিবর্তে আমি এটি চিত্রণমূলকভাবে ব্যবহার করছিলাম, যেহেতু এটি আপনাকে যে বৈশিষ্ট্যগুলি উল্লেখ করে তার উপর ভিত্তি করে বৈশিষ্ট্যগুলি সহজেই ফিল্টার করতে দেয় না। তবে আমার এ সম্পর্কে আরও স্পষ্ট হওয়া উচিত।
বেন

14

শুধুমাত্র উদাহরণের বৈশিষ্ট্যগুলি পাওয়া সহজ।
তবে ফাংশন ছাড়া শ্রেণীর বৈশিষ্ট্যগুলি পাওয়া আরও কিছুটা জটিল।

ইনস্ট্যান্স বৈশিষ্ট্যগুলি কেবলমাত্র

আপনি শুধুমাত্র লিস্টে থাকে তাহলে উদাহরণস্বরূপ বৈশিষ্ট্যাবলী শুধু ব্যবহার
for attribute, value in my_instance__dict__items()

>>> from __future__ import (absolute_import, division, print_function)
>>> class MyClass(object):
...   def __init__(self):
...     self.a = 2
...     self.b = 3
...   def print_instance_attributes(self):
...     for attribute, value in self.__dict__.items():
...       print(attribute, '=', value)
...
>>> my_instance = MyClass()
>>> my_instance.print_instance_attributes()
a = 2
b = 3
>>> for attribute, value in my_instance.__dict__.items():
...   print(attribute, '=', value)
...
a = 2
b = 3

তাত্ক্ষণিক এবং শ্রেণি বৈশিষ্ট্য

ফাংশন ছাড়াই বর্গ বৈশিষ্ট্যগুলি পেতে , কৌশলটি ব্যবহার করা হয় callable()

কিন্তু স্ট্যাটিক পদ্ধতি আছে সব সময় নয়callable !

সুতরাং, পরিবর্তে callable(value)ব্যবহার
callable( getattr(MyClass, attribute))

উদাহরণ

from __future__ import (absolute_import, division, print_function)

class MyClass(object):
   a = "12"
   b = "34"               # class attributes

   def __init__(self, c, d):
     self.c = c
     self.d = d           # instance attributes

   @staticmethod
   def mystatic():        # static method
       return MyClass.b

   def myfunc(self):      # non-static method
     return self.a

   def print_instance_attributes(self):
     print('[instance attributes]')
     for attribute, value in self.__dict__.items():
        print(attribute, '=', value)

   def print_class_attributes(self):
     print('[class attributes]')
     for attribute in self.__dict__.keys():
       if attribute[:2] != '__':
         value = getattr(self, attribute)
         if not callable(value):
           print(attribute, '=', value)

v = MyClass(4,2)
v.print_class_attributes()
v.print_instance_attributes()

দ্রষ্টব্য: print_class_attributes() হওয়া উচিত       তবে এই নির্বোধ এবং সহজ উদাহরণে নয়।@staticmethod

জন্য ফলাফল

$ python2 ./print_attributes.py
[class attributes]
a = 12
b = 34
[instance attributes]
c = 4
d = 2

একই ফলাফল

$ python3 ./print_attributes.py
[class attributes]
b = 34
a = 12
[instance attributes]
c = 4
d = 2

8

MyClass().__class__.__dict__

যাইহোক, "ডান" এটি করা ছিল পরিদর্শন মডিউলটির মাধ্যমে ।


6
MyClass().__class__.__dict__==MyClass.__dict__
ইয়াক

5
@ ইয়াকের মন্তব্য একেবারেই সত্য নয়। শ্রেণি এবং উদাহরণের বৈশিষ্ট্যের মধ্যে পার্থক্য সম্পর্কে নিম্নলিখিতটি দেখুন। স্ট্যাকওভারফ্লো . com/ প্রশ্নগুলি / 35805/ … দেখুন ।
sholsapp

@ শোলসঅ্যাপ আসলে @ ইয়াক ঠিক আছে। লিংক আপনার দেওয়া বলে MyClass().__class__.__dict__ != MyClass().__dict__, কিন্তু ইয়াক ক্ষেত্রে যার S / তিনি সঠিক সঠিক দিকে প্রথম বন্ধনী সহ করা হয় না,
দয়া

2
import re

class MyClass:
    a = "12"
    b = "34"

    def myfunc(self):
        return self.a

attributes = [a for a, v in MyClass.__dict__.items()
              if not re.match('<function.*?>', str(v))
              and not (a.startswith('__') and a.endswith('__'))]

মাই ক্লাসের উদাহরণের জন্য যেমন

mc = MyClass()

তালিকার বোধগম্যতার type(mc)জায়গায় ব্যবহার করুন MyClass। তবে, যদি কেউ গতিতে কোনও বৈশিষ্ট্যে যুক্ত করে mc, যেমন mc.c = "42", type(mc)এই কৌশলটি ব্যবহার করার সময় অ্যাট্রিবিউটটি প্রদর্শিত হবে না । এটি কেবলমাত্র মূল শ্রেণীর বৈশিষ্ট্য দেয়।

একটি বর্গ উদাহরণস্বরূপ সম্পূর্ণ অভিধান পেতে, আপনি এর অভিধান একত্রিত করতে হবে type(mc).__dict__এবং mc.__dict__

mc = MyClass()
mc.c = "42"

# Python 3.5
combined_dict = {**type(mc).__dict__, **mc.__dict__}

# Or Python < 3.5
def dict_union(d1, d2):
    z = d1.copy()
    z.update(d2)
    return z

combined_dict = dict_union(type(mc).__dict__, mc.__dict__)

attributes = [a for a, v in combined_dict.items()
              if not re.match('<function.*?>', str(v))
              and not (a.startswith('__') and a.endswith('__'))]

সত্যিই ঝরঝরে সমাধান।
গীতনিক

2

এখনই অনুরূপ কিছু তৈরি হয়েছে কিনা তা আমি জানি না, তবে আমি ভার্স () ব্যবহার করে একটি দুর্দান্ত বৈশিষ্ট্য অনুসন্ধান ফাংশন তৈরি করেছি। vars () আপনি যে শ্রেণীর মধ্য দিয়ে যাবেন তার বৈশিষ্ট্যের একটি অভিধান তৈরি করে।

class Player():
    def __init__(self):
        self.name = 'Bob'
        self.age = 36
        self.gender = 'Male'

s = vars(Player())
#From this point if you want to print all the attributes, just do print(s)

#If the class has a lot of attributes and you want to be able to pick 1 to see
#run this function
def play():
    ask = input("What Attribute?>: ")
    for key, value in s.items():
        if key == ask:
            print("self.{} = {}".format(key, value))
            break
    else:
        print("Couldn't find an attribute for self.{}".format(ask))

আমি পাইথনে বেশ বিশাল টেক্সট অ্যাডভেঞ্চার বিকাশ করছি, আমার প্লেয়ার ক্লাসে এখন পর্যন্ত 100 টিরও বেশি গুণ রয়েছে। আমার দেখতে পাওয়া নির্দিষ্ট বৈশিষ্ট্যগুলি অনুসন্ধান করতে আমি এটি ব্যবহার করি।


দুর্ভাগ্যক্রমে vars () শ্রেণীর বৈশিষ্ট্যগুলি ফিরিয়ে দেবে না
user2682863

আপনি যে কোডটি পোস্ট করেছেন তা চালানোর চেষ্টা করেছেন? যুদ্ধগুলি অবশ্যই শ্রেণীর বৈশিষ্ট্যগুলি ফিরিয়ে দিতে পারে। এটি কিভাবে হয় না তার একটি উদাহরণ আমাকে দেখান? হয়তো আমার কোডটি ভুল is তবে একটি ভেরিয়েবলকে ভার্স () বরাদ্দ করা এবং একটি ভেরিয়েবলের সাহায্যে একটি কী ব্যবহার করে মান সন্ধান শ্রেণীর বৈশিষ্ট্যগুলি ফিরিয়ে দিতে পারে।
কোরি বেলি

শ্রেণি টি: x = 1; t = টি (); vars (t)
user2682863

আপনাকে সঠিকভাবে দেখানোর জন্য আমি কাজ থেকে নামা না হওয়া পর্যন্ত আপনাকে অপেক্ষা করতে হবে। তবে আপনার কোডটি ভুল। আপনার শ্রেণি অবজেক্টের __init __ (স্ব) এবং সংক্ষিপ্ত বিবরণটিকে সেল.এক্স = 1 হওয়া দরকার। তারপরে t = T () নির্ধারণ করুন এবং মুদ্রণ (ভার্স (টি)) ব্যবহার করুন এবং এটি আপনাকে সমস্ত শ্রেণীর বৈশিষ্ট্যের একটি অভিধান দেখাবে।
কোরি বেইলি

না, এগুলি উদাহরণ শ্রেণীর বৈশিষ্ট্য নয়, অনেকগুলি উপ-শ্রেণি কখনই আরআইডি কল করে না । যেমনটি আমি বলেছি যে, ভার্স () শ্রেণীর বৈশিষ্ট্যগুলি ফিরিয়ে দেবে না, আপনাকে dir () বা inspect.getmebers () ব্যবহার করতে হবে
user2682863

2

এটি পরিদর্শন ছাড়াই করা যেতে পারে, আমার ধারণা।

নিম্নলিখিত ক্লাস নিন:

 class Test:
   a = 1
   b = 2

   def __init__(self):
     self.c = 42

   @staticmethod
   def toto():
     return "toto"

   def test(self):
     return "test"

সদস্যদের সাথে তাদের প্রকারের দিকে তাকানো:

t = Test()
l = [ (x, eval('type(x.%s).__name__' % x)) for x in dir(a) ]

... দেয়:

[('__doc__', 'NoneType'),
 ('__init__', 'instancemethod'),
 ('__module__', 'str'),
 ('a', 'int'),
 ('b', 'int'),
 ('c', 'int'),
 ('test', 'instancemethod'),
 ('toto', 'function')]

সুতরাং কেবলমাত্র ভেরিয়েবলগুলি আউটপুট করতে আপনাকে ফলাফলগুলি টাইপ করে ফিল্টার করতে হয় এবং নামগুলি '__' দিয়ে শুরু হয় না। যেমন

filter(lambda x: x[1] not in ['instancemethod', 'function'] and not x[0].startswith('__'), l)

[('a', 'int'), ('b', 'int'), ('c', 'int')] # actual result

এটাই.

দ্রষ্টব্য: আপনি যদি পাইথন 3 ব্যবহার করেন তবে পুনরাবৃত্তিকে তালিকায় রূপান্তর করুন।

আপনি যদি আরও শক্তিশালী উপায় এটি করতে চান তবে পরিদর্শন ব্যবহার করুন ।


2

পাইথন 2 এবং 3, হোয়াইট আউট আমদানি, তাদের ঠিকানার মাধ্যমে ফিল্টারিং অবজেক্ট

সংক্ষেপে সমাধান:

ফেরত ডিক {গুণবাচক নাম: বৈশিষ্ট্য_মূল্য} , অবজেক্ট ফিল্টার। অর্থাত{'a': 1, 'b': (2, 2), 'c': [3, 3]}

{k: val for k, val in self.__dict__.items() if not str(hex(id(val))) in str(val)}

ফিরতি তালিকা [বৈশিষ্ট্য_নাম] , অবজেক্ট ফিল্টার। অর্থাত['a', 'b', 'c', 'd']

[k for k, val in self.__dict__.items() if not str(hex(id(val))) in str(val)]

ফিরতি তালিকা [বৈশিষ্ট্য_মূল্য] , বস্তুগুলি ফিল্টার করা। অর্থাত[1, (2, 2), [3, 3], {4: 4}]

[val for k, val in self.__dict__.items() if not str(hex(id(val))) in str(val)]

ফিল্টারিং অবজেক্টস নয়

ifশর্তটি সরানো হচ্ছে । প্রত্যাবর্তন{'a': 1, 'c': [3, 3], 'b': (2, 2), 'e': <function <lambda> at 0x7fc8a870fd70>, 'd': {4: 4}, 'f': <object object at 0x7fc8abe130e0>}

{k: val for k, val in self.__dict__.items()}

দীর্ঘস্থায়ী সমাধান

যতদিন ডিফল্ট বাস্তবায়ন যেমন __repr__ওভাররাইড করা হয় নাif বিবৃতি ফিরে আসবে Trueযদি স্মরণে অবস্থানের হেক্সাডেসিমেল উপস্থাপনা valহয় __repr__রিটার্ন পংক্তি।

আপনার ডিফল্ট বাস্তবায়ন সম্পর্কিত এই উত্তরটি__repr__ দরকারী খুঁজে পেতে পারেন । সংক্ষেপে:

def __repr__(self):
    return '<{0}.{1} object at {2}>'.format(
      self.__module__, type(self).__name__, hex(id(self)))

এর মতো একটি স্ট্রিং ফেরত দেয়:

<__main__.Bar object at 0x7f3373be5998>

প্রতিটি উপাদানের মেমরির অবস্থানটি id()পদ্ধতিটির মাধ্যমে পাওয়া যায় ।

পাইথন ডক্স আইডি () সম্পর্কে বলেছেন:

কোনও বস্তুর "পরিচয়" ফিরিয়ে দিন। এটি একটি পূর্ণসংখ্যা যা তার জীবদ্দশায় এই বিষয়টির জন্য অনন্য এবং ধ্রুবক হওয়ার গ্যারান্টিযুক্ত। ওভারল্যাপিংবিহীন লাইফটাইমযুক্ত দুটি বস্তুর একই আইডি () মান থাকতে পারে।

সিপিথন বাস্তবায়নের বিশদ: এটি মেমরির অবজেক্টের ঠিকানা।


নিজে চেষ্টা করে দেখুন

class Bar:

    def __init__(self):

        self.a = 1
        self.b = (2, 2)
        self.c = [3, 3]
        self.d = {4: 4}
        self.e = lambda: "5"
        self.f = object()

    #__str__ or __repr__ as you prefer
    def __str__(self):
        return "{}".format(

            # Solution in Short Number 1
            {k: val for k, val in self.__dict__.items() if not str(hex(id(val))) in str(val)}

        )

# Main
print(Bar())

আউটপুট:

{'a': 1, 'c': [3, 3], 'b': (2, 2), 'd': {4: 4}}

দ্রষ্টব্য :

  • পাইথন 2.7.13এবং পাইথনের সাথে পরীক্ষিত3.5.3

  • পাইথনে ২.x .iteritems()এর চেয়ে বেশি পছন্দ করা হয়.items()


1

আমার সম্প্রতি এই প্রশ্নের অনুরূপ কিছু বের করার দরকার ছিল, তাই আমি এমন কিছু ব্যাকগ্রাউন্ড তথ্য পোস্ট করতে চেয়েছিলাম যা ভবিষ্যতে অন্যদের জন্য একই রকম হতে পারে helpful

পাইথনে এটি কীভাবে কাজ করে তা এখানে ( https://docs.python.org/3.5/references/datamodel.html#the-standard-type-hierarchy ) থেকে :

MyClassক্লাস অবজেক্ট, MyClass()এটি ক্লাস অবজেক্টের একটি উদাহরণ। উদাহরণস্বরূপ __dict__কেবলমাত্র উদাহরণের জন্য নির্দিষ্ট বৈশিষ্ট্য এবং পদ্ধতি নির্দিষ্ট থাকে (যেমন self.somethings)। যদি কোনও বৈশিষ্ট্য বা পদ্ধতি কোনও শ্রেণীর অংশ হয় তবে এটি শ্রেণীর হয় __dict__। আপনি যখন করেন MyClass().__dict__, MyClassশ্রেণীর বৈশিষ্ট্যগুলি ছাড়া কোনও বৈশিষ্ট্য বা পদ্ধতি ছাড়াই একটি উদাহরণ তৈরি করা হয়, এভাবে খালি__dict__

সুতরাং আপনি যদি বলেন print(MyClass().b), পাইথন প্রথমে নতুন উদাহরণটির ডিক পরীক্ষা করে MyClass().__dict__['b']এবং এটি ব্যর্থ হয় b। এটি তখন ক্লাসটি পরীক্ষা করে এটি MyClass.__dict__['b']সন্ধান করে b

এজন্য আপনার inspectএকই মডিউলটির প্রয়োজন , একই অনুসন্ধান প্রক্রিয়াটি অনুকরণ করতে।


2
স্কট - উত্তর হিসাবে পোস্ট করা একটি মন্তব্য অবশ্যই মুছে ফেলা হবে, অন্যথায় আমরা সেগুলিতে ডুবে যাব। তবে কোনও সমাধানের দিকে আংশিক উত্তর বা "সহায়ক নুড" এখনও একটি উত্তর । আপনি দেখতে পাবেন যে আমি কীভাবে আপনার পোস্টটির উচ্চারণ করেছি; আশা করি আমি আপনার অভিপ্রায় ধরে রেখেছি যদি তা না হয় তবে আপনি এটিকে আরও আকারে সম্পাদনা করতে পারেন । চিয়ার্স!
মোগসদাদ

1

বৈশিষ্ট্যের নামগুলি পেতে dir()আপনি একটি তালিকা বোধগম্য ব্যবহার করতে পারেন :

names = [p for p in dir(myobj) if not p.startswith('_')]

getattr()বৈশিষ্ট্যগুলি নিজেরাই পেতে ব্যবহার করুন :

attrs = [getattr(myobj, p) for p in dir(myobj) if not p.startswith('_')]

1

শ্রেণীর সমস্ত বৈশিষ্ট্য (পদ্ধতি নয়) পাওয়ার আমার সমাধান (ক্লাসে যদি সঠিকভাবে লিখিত ডক্ট্রিং থাকে যা বৈশিষ্ট্যগুলি স্পষ্টভাবে বর্ণিত থাকে):

def get_class_attrs(cls):
    return re.findall(r'\w+(?=[,\)])', cls.__dict__['__doc__'])

এই টুকরা cls.__dict__['__doc__']ক্লাসের ডক্ট্রাস্টিং নিষ্কাশন করে।


1

আপনাকে বৈশিষ্ট্যগুলি তালিকাভুক্ত করার দরকার কেন? মনে হচ্ছে শব্দার্থকভাবে আপনার ক্লাসটি একটি সংগ্রহ। এই ক্ষেত্রে আমি এনাম ব্যবহার করার পরামর্শ দিচ্ছি:

import enum

class myClass(enum.Enum):
     a = "12"
     b = "34"

আপনার গুণাবলী তালিকাভুক্ত? এর চেয়ে সহজ আর কিছুই নয়:

for attr in myClass:
    print("Name / Value:", attr.name, attr.value)

1

যদি আপনি কোনও বৈশিষ্ট্য "পেতে" চান তবে খুব সহজ উত্তর রয়েছে , যা সুস্পষ্ট হওয়া উচিত: গেটআটার tr

class MyClass(object):
a = '12'
b = '34'
def myfunc(self):
    return self.a

>>> getattr(MyClass, 'a')
'12'

>>> getattr(MyClass, 'myfunc')
<function MyClass.myfunc at 0x10de45378>

এটি পাইথন ২.7 এবং পাইথন ৩.x উভয় স্থানে কাজ করে works

আপনি যদি এই আইটেমগুলির একটি তালিকা চান তবে আপনাকে এখনও পরিদর্শন ব্যবহার করতে হবে।


1
উত্তরটি কি খুব সাধারণ এবং কোনও পয়েন্ট প্রাপ্য উপযুক্ত এবং খুব খারাপ পয়েন্টও প্রাপ্য? দেখে মনে হচ্ছে অর্থনীতি এবং সরলতা আজকাল আর পরিশোধ করে না।
ফ্রেওলু

0

দুটি ফাংশন:

def get_class_attr(Cls) -> []:
    import re
    return [a for a, v in Cls.__dict__.items()
              if not re.match('<function.*?>', str(v))
              and not (a.startswith('__') and a.endswith('__'))]

def get_class_attr_val(cls):
    attr = get_class_attr(type(cls))
    attr_dict = {}
    for a in attr:
        attr_dict[a] = getattr(cls, a)
    return attr_dict

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

>>> class MyClass:
    a = "12"
    b = "34"
    def myfunc(self):
        return self.a

>>> m = MyClass()
>>> get_class_attr_val(m)
{'a': '12', 'b': '34'}

0

নিম্নলিখিত আমি চাই কি।

পরীক্ষার ডেটা

class Base:
    b = 'b'


class MyClass(Base):
    a = '12'

    def __init__(self, name):
        self.name = name

    @classmethod
    def c(cls):
        ...

    @property
    def p(self):
        return self.a

    def my_fun(self):
        return self.name
print([name for name, val in inspect.getmembers(MyClass) if not name.startswith('_') and not callable(val)])  # need `import inspect`
print([_ for _ in dir(MyClass) if not _.startswith('_') and not callable(getattr(MyClass, _))])
# both are equ: ['a', 'b', 'p']

my_instance = MyClass('c')
print([_ for _ in dir(my_instance) if not _.startswith('_') and not callable(getattr(my_instance, _))])
# ['a', 'b', 'name', 'p']

-2

আমি জানি এটি তিন বছর আগে ছিল, তবে ভবিষ্যতে যারা এই প্রশ্নে আসবেন তাদের জন্য:

class_name.attribute 

ঠিক কাজ করে।


3
আপনি যখন কোনও অ্যাট্রিবিউটআরার পান তা বাদে।
রেডি

আপনি সবসময় attributeআগে কী তা জানেন না ।
ম্যাট লুঙ্গো

-3

আপনি ব্যবহার করতে পারেন MyClass.__attrs__। এটি কেবল এই শ্রেণীর সমস্ত বৈশিষ্ট্য দেয়। বেশি না.


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