শ্রেণিবদ্ধ সজ্জিত ফাংশনগুলির সাথে সম্পত্তি () ফাংশনটি ব্যবহার করা কি সম্ভব?
না।
যাইহোক, একটি শ্রেণিবদ্ধ একটি শ্রেণীর উপর কেবল সেই শ্রেণীর উদাহরণ থেকে অ্যাক্সেসযোগ্য একটি আবদ্ধ পদ্ধতি (আংশিক ফাংশন)।
যেহেতু উদাহরণটি ক্লাসের একটি ক্রিয়াকলাপ এবং উদাহরণটি থেকে আপনি ক্লাসটি অর্জন করতে পারেন তাই আপনি শ্রেণি-সম্পত্তি থেকে যা কিছু পছন্দ করতে পারেন তা পেতে পারেন property
:
class Example(object):
_class_property = None
@property
def class_property(self):
return self._class_property
@class_property.setter
def class_property(self, value):
type(self)._class_property = value
@class_property.deleter
def class_property(self):
del type(self)._class_property
এই কোডটি পরীক্ষার জন্য ব্যবহার করা যেতে পারে - এটি কোনও ত্রুটি না বাড়িয়ে পাস করা উচিত:
ex1 = Example()
ex2 = Example()
ex1.class_property = None
ex2.class_property = 'Example'
assert ex1.class_property is ex2.class_property
del ex2.class_property
assert not hasattr(ex1, 'class_property')
এবং মনে রাখবেন যে আমাদের মোটেও মেটাক্লাসের প্রয়োজন হয়নি - এবং আপনি কোনওভাবেই ক্লাসের উদাহরণগুলির মাধ্যমে কোনও মেটাক্লাস অ্যাক্সেস করেন না।
একটি @classproperty
সজ্জা লেখক
আপনি classproperty
সাবক্লাসিং করে কোডের কয়েকটি লাইনটিতে প্রকৃতপক্ষে একটি সজ্জা তৈরি করতে পারেন property
(এটি সি তে প্রয়োগ করা হয়েছে, তবে আপনি এখানে পাইথন সমতুল্য দেখতে পারেন ):
class classproperty(property):
def __get__(self, obj, objtype=None):
return super(classproperty, self).__get__(objtype)
def __set__(self, obj, value):
super(classproperty, self).__set__(type(obj), value)
def __delete__(self, obj):
super(classproperty, self).__delete__(type(obj))
তারপরে সাজসজ্জারকে এমন আচরণ করুন যেন এটি সম্পত্তির সাথে মিলিত কোনও শ্রেণিবদ্ধ thod
class Foo(object):
_bar = 5
@classproperty
def bar(cls):
"""this is the bar attribute - each subclass of Foo gets its own.
Lookups should follow the method resolution order.
"""
return cls._bar
@bar.setter
def bar(cls, value):
cls._bar = value
@bar.deleter
def bar(cls):
del cls._bar
এবং এই কোডটি ত্রুটি ছাড়াই কাজ করা উচিত:
def main():
f = Foo()
print(f.bar)
f.bar = 4
print(f.bar)
del f.bar
try:
f.bar
except AttributeError:
pass
else:
raise RuntimeError('f.bar must have worked - inconceivable!')
help(f) # includes the Foo.bar help.
f.bar = 5
class Bar(Foo):
"a subclass of Foo, nothing more"
help(Bar) # includes the Foo.bar help!
b = Bar()
b.bar = 'baz'
print(b.bar) # prints baz
del b.bar
print(b.bar) # prints 5 - looked up from Foo!
if __name__ == '__main__':
main()
তবে এটি কতটা ভাল পরামর্শ দেওয়া হবে তা আমি নিশ্চিত নই। একটি পুরানো মেলিং তালিকা নিবন্ধ পরামর্শ দেয় যে এটি কাজ করা উচিত নয়।
ক্লাসে কাজ করার জন্য সম্পত্তি পাওয়া:
উপরের দিকের দিকটি হ'ল "শ্রেণীর সম্পত্তি" ক্লাস থেকে অ্যাক্সেসযোগ্য নয়, কারণ এটি কেবল শ্রেণি থেকে ডেটা বর্ণনাকারীকে ওভাররাইট করে __dict__
।
তবে, আমরা এটি মেটাক্লাসে সংজ্ঞায়িত কোনও সম্পত্তি দিয়ে ওভাররাইড করতে পারি __dict__
। উদাহরণ স্বরূপ:
class MetaWithFooClassProperty(type):
@property
def foo(cls):
"""The foo property is a function of the class -
in this case, the trivial case of the identity function.
"""
return cls
এবং তারপরে মেটাক্লাসের একটি শ্রেণীর উদাহরণটিতে এমন একটি সম্পত্তি থাকতে পারে যা পূর্ববর্তী বিভাগগুলিতে ইতিমধ্যে প্রদর্শিত নীতিটি ব্যবহার করে শ্রেণীর সম্পত্তি অ্যাক্সেস করে:
class FooClassProperty(metaclass=MetaWithFooClassProperty):
@property
def foo(self):
"""access the class's property"""
return type(self).foo
এবং এখন আমরা উভয় উদাহরণ দেখতে পাচ্ছি
>>> FooClassProperty().foo
<class '__main__.FooClassProperty'>
এবং ক্লাস
>>> FooClassProperty.foo
<class '__main__.FooClassProperty'>
শ্রেণীর সম্পত্তি অ্যাক্সেস আছে।