কীভাবে গতিশীলভাবে কোনও শ্রেণিতে সম্পত্তি যুক্ত করবেন?


215

লক্ষ্যটি একটি মক ক্লাস তৈরি করা যা ডিবি রেজাল্টের মতো আচরণ করে।

সুতরাং উদাহরণস্বরূপ, যদি কোনও ডাটাবেস কোয়েরি যদি ডিক এক্সপ্রেশন ব্যবহার করে ফিরে আসে {'ab':100, 'cd':200}, তবে আমি দেখতে চাই:

>>> dummy.ab
100

প্রথমে আমি ভেবেছিলাম সম্ভবত আমি এটি এইভাবে করতে পারি:

ks = ['ab', 'cd']
vs = [12, 34]
class C(dict):
    def __init__(self, ks, vs):
        for i, k in enumerate(ks):
            self[k] = vs[i]
            setattr(self, k, property(lambda x: vs[i], self.fn_readyonly))

    def fn_readonly(self, v)
        raise "It is ready only"

if __name__ == "__main__":
    c = C(ks, vs)
    print c.ab

তবে c.abপরিবর্তে কোনও সম্পত্তি বস্তু প্রদান করে।

এর setattrসাথে লাইনটি প্রতিস্থাপন করা মোটেই k = property(lambda x: vs[i])কার্যকর নয়।

সুতরাং রানটাইম সময়ে একটি উদাহরণ সম্পত্তি তৈরি করার সঠিক উপায় কী?

PS আমি উপস্থাপন করা একটি বিকল্প সম্পর্কে অবগত যে __getattribute__পদ্ধতিটি কীভাবে ব্যবহৃত হয়?


2
আপনার কোডে কয়েকটি টাইপ রয়েছে: fn_readonly এর সংজ্ঞাটির একটি :এবং __init__রেফারেন্স প্রয়োজন self.fn_readyonly
mhakke

তুমি ঠিক. আমি রানটাইমে কোনও সম্পত্তি তৈরির কারণটি আন্ডারলাইন করতে শেষ মুহুর্তে সেটার ফাংশনটি যুক্ত করেছি।
অ্যান্টনি কং

প্রারম্ভিককরণে সম্পত্তি তৈরি করার ক্ষেত্রে আমার যে প্রধান সমস্যাটি ছিল তা হ'ল, কিছু ক্ষেত্রে যদি আমি সাহায্যকারীদের তাড়াতাড়ি কল করি বা কোনও সমস্যা হয় তবে আমি একটি ত্রুটি পেয়ে যাব যে তারা সত্ত্বেও তাদের উপস্থিতি নেই। নীচে আমার সমাধানে, আমি 2 ক্লাস তৈরি করি। বেস / প্যারেন্ট হিসাবে একটি (যা আমি এড়াতে সমাধানের চেষ্টা করছি), এবং মূল অবজেক্ট, যা বেস / পিতামাতাকে প্রসারিত করে। তারপরে, প্রধান অবজেক্টে, আরম্ভ না করেই আমি আমার অ্যাক্সেসরফঙ্ক স্রষ্টাকে কল করি যা বৈশিষ্ট্য, সহায়ক ফাংশন এবং আরও অনেক কিছু তৈরি করে।
এস্কুল

অর্থাত: বর্গ উদাহরণস্বরূপ: পাস; শ্রেণীর উদাহরণ (উদাহরণস্বরূপ): __x = অ্যাক্সেসর (উদাহরণস্বরূপ, 'x', 'এক্স', 123); --- যা এক্স এর অধীনে একটি সম্পত্তি তৈরি করবে এবং এক্স হিসাবে গেটএক্স, সেটএক্স, এবং আরও ... এবং .x, ._x, এবং .__ x ব্যবহার করে ক্রিয়াকলাপের নামকরণ করবে। সুতরাং .x হ'ল ডেটা দিয়ে যাওয়ার জন্য নিজস্ব সম্পত্তি (সেল্ফ.এক্স = 123 এর মাধ্যমে প্রাপ্ত / সেটিং বা আউটপুটে সেল.এক্স)। আমি সংরক্ষিত RAW ডেটার জন্য self._x ব্যবহার করেছি যাতে এটি সহজেই অ্যাক্সেসযোগ্য হতে পারে কারণ আমি ডিফল্ট মানগুলিকে সঞ্চিত ডেটাতে সেট না করেই নির্ধারিত করে দিয়েছিলাম। সুতরাং _x কোনওটিই হতে পারে না এবং .x 123 ফিরে আসতে পারে and এবং। x এক্স অ্যাকসেসরের সাথে যুক্ত
এস্কুল

এখানে বেসিক সংস্করণটির একটি লিঙ্ক রয়েছে যা গতিশীল বৈশিষ্ট্য এবং গতিশীল ফাংশন তৈরি করে - এই ফাইলটিতে অন্যান্য সংস্করণে লিঙ্কের একটি গুচ্ছ রয়েছে। একটি হ'ল সহায়ক তৈরি করার জন্য একটি ফাংশন ব্যবহার করে অ্যাকসেসরফঙ্ক সিস্টেম (একটি ফাংশনের জন্য, একটি বৈশিষ্ট্যের জন্য, পৃথক উপাদান উভয়ের জন্য একটি - তাই এটি সেই ফাইলের কোনও কিছুর ক্ষেত্রে কোড সংক্ষেপণ ব্যবহার করে না) .. যদি কিছু অনুপস্থিত থাকে তবে একটি : অন্যান্য ফাইল এটা আছে dropbox.com/s/phnnuavssmzeqrr/dynamic_properties_simple.py?dl=0
Acecool

উত্তর:


333

আমি মনে করি আমার এই উত্তরটি প্রসারিত করা উচিত, এখন আমি বয়স্ক এবং বুদ্ধিমান এবং কী হচ্ছে তা জেনে রাখা। কখনও না থেকে ভাল।

আপনি গতিশীলভাবে কোনও শ্রেণিতে একটি সম্পত্তি যুক্ত করতে পারেন। তবে এটি ধরা: আপনি এটি ক্লাসে যুক্ত করতে হবে ।

>>> class Foo(object):
...     pass
... 
>>> foo = Foo()
>>> foo.a = 3
>>> Foo.b = property(lambda self: self.a + 1)
>>> foo.b
4

একজন propertyআসলে একটা জিনিস একটি নামক একটি সহজ বাস্তবায়ন বর্ণনাকারী । এটি এমন একটি বস্তু যা প্রদত্ত শ্রেণীর উপর একটি প্রদত্ত গুণকের জন্য কাস্টম হ্যান্ডলিং সরবরাহ করে । কিন্ডা একটি বিশাল ifগাছ থেকে বেরিয়ে আসার উপায় __getattribute__

যখন আমি জিজ্ঞাসা foo.bউপরোক্ত উদাহরণের, পাইথন দেখে bবর্গ কার্যকরী সংজ্ঞাসমূহ বর্ণনাকারী প্রোটোকল -যেটা শুধু এটা একটি সঙ্গে একটি বস্তু মানে __get__, __set__অথবা __delete__পদ্ধতি। বর্ণনাকারী সেই বৈশিষ্ট্যটি পরিচালনা করার জন্য দায়দায়িত্ব দাবি করে, তাই পাইথন কল করে Foo.b.__get__(foo, Foo)এবং ফেরতের মানটি আপনাকে গুণকের মান হিসাবে ফিরিয়ে দেওয়া হয়। ক্ষেত্রে property, এই পদ্ধতি প্রতিটি মাত্র কল fget, fsetঅথবা fdelআপনি প্রেরণ propertyকন্সট্রাকটর।

বর্ণনাকারীরা হ'ল পাইথনের পুরো OO বাস্তবায়নের নদীর গভীরতাকে প্রকাশ করার উপায়। আসলে, এর চেয়ে আরও সাধারণ একটি বর্ণনাকারী রয়েছে property

>>> class Foo(object):
...     def bar(self):
...         pass
... 
>>> Foo().bar
<bound method Foo.bar of <__main__.Foo object at 0x7f2a439d5dd0>>
>>> Foo().bar.__get__
<method-wrapper '__get__' of instancemethod object at 0x7f2a43a8a5a0>

নম্র পদ্ধতিটি হ'ল অন্য ধরণের বর্ণনাকারী। তার __get__প্রথম আর্গুমেন্ট হিসাবে কলিং উদাহরণস্বরূপ উপর tacks; বাস্তবে, এটি এটি করে:

def __get__(self, instance, owner):
    return functools.partial(self.function, instance)

যাইহোক, আমি সন্দেহ করি এই কারণেই বর্ণনাকারীরা কেবল ক্লাসে কাজ করেন: তারা এমন স্টাফের একটি আনুষ্ঠানিককরণ যা ক্লাসকে প্রথম স্থানে শক্তি দেয়। এগুলি এমনকি নিয়মের ব্যতিক্রম: আপনি স্পষ্টতই কোনও শ্রেণিতে বর্ণনাকারী নির্ধারণ করতে পারেন এবং ক্লাসগুলি নিজেরাই এর উদাহরণ type! আসলে, Foo.bস্টিল কলগুলি পড়ার চেষ্টা করা property.__get__; শ্রেণিবদ্ধ বৈশিষ্ট্য হিসাবে অ্যাক্সেস করা হলে বর্ণনাকারীদের নিজেকে ফিরিয়ে দেওয়া কেবল মুশকিল।

আমি মনে করি এটি বেশ দুর্দান্ত যে কার্যত পাইথনের সমস্ত ওও সিস্টেমটি পাইথনে প্রকাশ করা যেতে পারে। :)

ওহ, এবং আগ্রহী যদি আমি কিছুক্ষণ আগে বর্ণনাকারীদের সম্পর্কে একটি শব্দযুক্ত ব্লগ পোস্ট লিখেছিলাম ।


35
Add_property পদ্ধতি যুক্ত করার দরকার নেই। setattr (Foo, 'name', property (func))
কোর্টনি ডি

8
আপনার "তবে এটিই ধরা ..." আমাকে বেশ কয়েক ঘন্টা কাজ বাঁচিয়েছে। ধন্যবাদ.
ম্যাট হাওয়েল

2
আপনি যদি একক দৃষ্টিতে কোনও সম্পত্তি সংজ্ঞায়িত করতে চান তবে আপনি রানটাইমে একটি শ্রেণি তৈরি করতে এবং __class__ সংশোধন করতে পারেন
উইলফ্রেড হিউজ 15

1
@ মাইপ্রোপার্টি.সেটটার সম্পর্কে কী? এটি কীভাবে যুক্ত করবেন?
LRMAAX

আপনার আরম্ভ করা অবজেক্টে কোনও সম্পত্তি যুক্ত করার দরকার নেই। এটি করার অর্থ এটি কেবল উদাহরণের সাথে লেগে থাকে তবে আমাকে এটি দ্বিগুণ করতে হবে। আমি জানি যে আমি একইরকম ইস্যুতে দৌড়েছি যেখানে আমার গতিশীল বৈশিষ্ট্যগুলি কেবল উদাহরণস্বরূপ ছিল, আমি একটি স্থির সেটআপ দিয়েও শেষ হয়েছি এবং যা আমি চেয়েছিলাম যা অবজেক্টটির সাথে হয় যাতে ভবিষ্যতে আরম্ভকরণগুলি সেগুলি ব্যবহার করে। আমার পোস্টটি নীচে রয়েছে এবং এটি সহায়ক ফাংশন এবং সহজেই সমস্ত কিছু অ্যাক্সেস করার সহজ উপায় তৈরি করে। সম্পত্তির জন্য .x, গেটার / সেটার ব্যবহার করা কাঁচা ডেটার জন্য। x x এবং অ্যাক্সেসর অবজেক্টের জন্য .__ x।
এস্কুল

57

লক্ষ্যটি একটি মক ক্লাস তৈরি করা যা ডিবি রেজাল্টের মতো আচরণ করে।

সুতরাং আপনি কী চান এমন একটি অভিধান যেখানে আপনি একটি ['বি'] অক্ষর হিসাবে বানান করতে পারেন?

এটা সহজ:

class atdict(dict):
    __getattr__= dict.__getitem__
    __setattr__= dict.__setitem__
    __delattr__= dict.__delitem__

1
আরও সাধারণ সেটআপে এটি সীমিত উদ্দেশ্যে কাজ করে। যদি ডিকের বহু স্তরের শ্রেণিবিন্যাস থাকে, যেমন d = {'a1': {'b': 'c'}, 'a2': ...}, তবে আপনি d.a1 বা d.a2 করতে পারলে আপনি ' টি d.a1.b না
Shreyas

1
মনে রাখতে হবে একটি বিষয় যে, এই অভি পদ্ধতি বা বৈশিষ্ট্যাবলী নামেই বৈশিষ্ট্যাবলী জন্য গুণাবলীর মানটি সেটিং পারবেন, কিন্তু একই ভাবে আবার মান পুনরুদ্ধার করার অনুমতি দেয় না: d.items = 1, d.itemsআয় <built-in method items of atdict object at ...>। আপনি তার পরিবর্তে এখনও করতে d["items"]বা ব্যবহার করতে __getattribute__পারবেন __getattr__তবে ডিকের বেশিরভাগ পদ্ধতি ব্যবহার করা বাধা দেয়।
মার্কনো 1234

শুধু গুচ্ছ গ্রন্থাগার ব্যবহার করুন ! (গুচ্ছের কাঁটাচামচ)
ব্রায়ান পিটারসন

38

দেখে মনে হচ্ছে আপনি খুব সহজেই এ সমস্যার সমাধান করতে পারেন namedtuple, যেহেতু আপনি আগে ক্ষেত্রের পুরো তালিকাটি জানেন।

from collections import namedtuple

Foo = namedtuple('Foo', ['bar', 'quux'])

foo = Foo(bar=13, quux=74)
print foo.bar, foo.quux

foo2 = Foo()  # error

আপনার যদি নিজের সেটটারটি একেবারে লেখার দরকার হয় তবে আপনাকে ক্লাস স্তরে রূপকটি করতে হবে; property()দৃষ্টান্তগুলিতে কাজ করে না।


ভালো বুদ্ধি. দুর্ভাগ্যক্রমে আমি এই মুহুর্তে অজগর ২.৪ এর সাথে আটকে আছি।
অ্যান্টনি কং


2
যে ছেলেটি লিখেছিল namedtupleসে বিশ্বস্ত অবজেক্ট-ভিত্তিক নীতি হিসাবে মসৃণ এবং মার্জিত করার জন্য একটি পুরষ্কারের দাবিদার।
কিথ পিনসন

4
দুঃখিত, সর্বোপরি, এই উত্তরটি কেবলমাত্র সেই বিশেষ ক্ষেত্রে প্রযোজ্য যেখানে কেবলমাত্র পঠনযোগ্য কেবলমাত্রযুক্ত বৈশিষ্ট্য সমন্বিত একটি ওয়ান্টাস শ্রেণি আগে থেকেই জানে। অন্য কথায়, আমি মনে করি না যে এটি রানার সময় কোনও শ্রেণিতে কীভাবে সাধারণ বৈশিষ্ট্যগুলি - কেবলমাত্র পঠনযোগ্য নয় - কীভাবে যুক্ত করতে হবে তার বিস্তৃত প্রশ্নকে সম্বোধন করে (অন্য "অ্যাড-অন" উত্তরটির বর্তমান সংস্করণটিও দেয় না) লেখক পোস্ট করেছেন)।
মার্টিনো

@ মার্টিনিউ তাই ... আরও যুক্তি পাস property()? উভয় উত্তরে এমন কিছুই নেই যা কেবলমাত্র পঠনযোগ্য বৈশিষ্ট্যগুলির জন্য নির্দিষ্ট।
ইভি

32

এর জন্য আপনার কোনও সম্পত্তি ব্যবহার করার দরকার নেই। কেবল __setattr__তাদের পড়তে বাধ্য করতে ওভাররাইড করুন।

class C(object):
    def __init__(self, keys, values):
        for (key, value) in zip(keys, values):
            self.__dict__[key] = value

    def __setattr__(self, name, value):
        raise Exception("It is read only!")

Tada।

>>> c = C('abc', [1,2,3])
>>> c.a
1
>>> c.b
2
>>> c.c
3
>>> c.d
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'C' object has no attribute 'd'
>>> c.d = 42
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 6, in __setattr__
Exception: It is read only!
>>> c.a = 'blah'
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 6, in __setattr__
Exception: It is read only!

9

কীভাবে একটি অজগর শ্রেণিতে গতিশীলভাবে সম্পত্তি যুক্ত করবেন?

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

একটি ক্লাস তৈরি করুন

এর জন্য ডকুমেন্টেশনেরproperty উপর ভিত্তি করে একটি উদাহরণ ব্যবহার করে আসুন একটি "লুকানো" বৈশিষ্ট্যযুক্ত অবজেক্টের শ্রেণি তৈরি করি এবং এর উদাহরণ তৈরি করি:

class C(object):
    '''basic class'''
    _x = None

o = C()

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

গতিশীল (ওরফে বানর প্যাচিং)

আসুন আমাদের ক্লাসের জন্য কিছু তৈরি করুন:

def getx(self):
    return self._x

def setx(self, value):
    self._x = value

def delx(self):
    del self._x

এবং এখন আমরা সম্পত্তি এগুলি নিয়োগ। নোট করুন যে আমরা গতিশীল প্রশ্নের উত্তর দিয়ে প্রোগ্রামগুলি এখানে আমাদের ফাংশনগুলি বেছে নিতে পারি:

C.x = property(getx, setx, delx, "I'm the 'x' property.")

এবং ব্যবহার:

>>> o.x = 'foo'
>>> o.x
'foo'
>>> del o.x
>>> print(o.x)
None
>>> help(C.x)
Help on property:

    I'm the 'x' property.

সজ্জা

আমরা ডেকোরেটর স্বরলিপি দিয়ে উপরে যেমনটি করেছি ঠিক তেমনই করতে পারি, তবে এই ক্ষেত্রে, আমাদের অবশ্যই পদ্ধতিগুলির নামটি একই নাম (এবং আমি এটির বৈশিষ্ট্য হিসাবে একই রাখার প্রস্তাব দেব), সুতরাং প্রোগ্রাম্যাটিক অ্যাসাইনমেন্ট এতটা তুচ্ছ নয় এটি উপরোক্ত পদ্ধতিটি ব্যবহার করছে:

@property
def x(self):
    '''I'm the 'x' property.'''
    return self._x

@x.setter
def x(self, value):
    self._x = value

@x.deleter
def x(self):
    del self._x

এবং সম্পত্তি বস্তুকে তার বিধানযুক্ত সেটটার এবং মুছে ফেলা শ্রেণীর সাথে বরাদ্দ করুন:

C.x = x

এবং ব্যবহার:

>>> help(C.x)
Help on property:

    I'm the 'x' property.

>>> o.x
>>> o.x = 'foo'
>>> o.x
'foo'
>>> del o.x
>>> print(o.x)
None

5

একটি সাধারণ ক্লাস তৈরির জন্য একটি ক্লাস কারখানা তৈরি করতে আমি এই স্ট্যাক ওভারফ্লো পোস্টে একটি অনুরূপ প্রশ্ন জিজ্ঞাসা করেছি । ফলাফলটি ছিল এই উত্তর যা ক্লাস কারখানার একটি কার্যকরী সংস্করণ ছিল। উত্তরের স্নিপেট এখানে দেওয়া হল:

def Struct(*args, **kwargs):
    def init(self, *iargs, **ikwargs):
        for k,v in kwargs.items():
            setattr(self, k, v)
        for i in range(len(iargs)):
            setattr(self, args[i], iargs[i])
        for k,v in ikwargs.items():
            setattr(self, k, v)

    name = kwargs.pop("name", "MyStruct")
    kwargs.update(dict((k, None) for k in args))
    return type(name, (object,), {'__init__': init, '__slots__': kwargs.keys()})

>>> Person = Struct('fname', 'age')
>>> person1 = Person('Kevin', 25)
>>> person2 = Person(age=42, fname='Terry')
>>> person1.age += 10
>>> person2.age -= 10
>>> person1.fname, person1.age, person2.fname, person2.age
('Kevin', 35, 'Terry', 32)
>>>

আপনার লক্ষ্যটি হ'ল ডিফল্ট মান তৈরি করতে আপনি এর কিছু প্রকরণ ব্যবহার করতে পারেন (এই প্রশ্নের সাথে একটি প্রশ্নের উত্তরও রয়েছে যা এটি এর সাথে সম্পর্কিত)।


4

আমি প্রশ্নটি পুরোপুরি বুঝতে পেরেছি কিনা তা নিশ্চিত নই তবে আপনি __dict__আপনার ক্লাসের অন্তর্নির্মিত সহ রান টাইমে উদাহরণ বৈশিষ্ট্যগুলি সংশোধন করতে পারেন :

class C(object):
    def __init__(self, ks, vs):
        self.__dict__ = dict(zip(ks, vs))


if __name__ == "__main__":
    ks = ['ab', 'cd']
    vs = [12, 34]
    c = C(ks, vs)
    print(c.ab) # 12

সংক্ষেপে আমার প্রশ্নটি রানটাইমে কোনও নতুন সম্পত্তি তৈরি করা সম্ভব কিনা তা অনুসন্ধান করা। Theকমত্যটি নেতিবাচক বলে মনে হচ্ছে। আপনার পরামর্শ অবশ্যই সহজ এবং বাস্তব। ( ডিক্ট ব্যবহার করে এমন অন্যান্য উত্তরের ক্ষেত্রেও )
অ্যান্টনি কং

একটি সহজ উত্তরও হবে:self.__dict__[key] = value
অ্যালান কার্লসন

4

অনুসন্ধান ইঞ্জিন থেকে আগতদের জন্য, গতিশীল বৈশিষ্ট্যগুলির বিষয়ে কথা বলার সময় আমি যে দুটি জিনিস সন্ধান করছিলাম তা এখানে :

class Foo:
    def __init__(self):
        # we can dynamically have access to the properties dict using __dict__
        self.__dict__['foo'] = 'bar'

assert Foo().foo == 'bar'


# or we can use __getattr__ and __setattr__ to execute code on set/get
class Bar:
    def __init__(self):
        self._data = {}
    def __getattr__(self, key):
        return self._data[key]
    def __setattr__(self, key, value):
        self._data[key] = value

bar = Bar()
bar.foo = 'bar'
assert bar.foo == 'bar'

__dict__আপনি গতিশীলভাবে তৈরি বৈশিষ্ট্য রাখতে চান ভাল। __getattr__যখন মান প্রয়োজন হয় তখনই কিছু করা ভাল, যেমন একটি ডাটাবেসকে জিজ্ঞাসা করা। সেট / গেট কম্বো ক্লাসে সঞ্চিত ডেটা অ্যাক্সেসকে সহজ করার জন্য ভাল (উপরের উদাহরণের মতো)।

আপনি যদি কেবল একটি গতিশীল সম্পত্তি চান তবে সম্পত্তি () বিল্ট-ইন ফাংশনটি দেখুন।


4

property()রানটাইমের সময় আপনি কোনও উদাহরণে নতুন যুক্ত করতে পারবেন না কারণ বৈশিষ্ট্যগুলি ডেটা বর্ণনাকারী। পরিবর্তে __getattribute__উদাহরণস্বরূপ ডেটা বর্ণনাকারীদের প্রক্রিয়া করার জন্য আপনাকে গতিশীলভাবে একটি নতুন বর্গ তৈরি করতে হবে, বা ওভারলোড করতে হবে।


এটা ভুল. আপনি শ্রেণিতে সম্পত্তি যুক্ত করতে পারেন তারপরে পদ্ধতিটি থেকে এটি অ্যাক্সেস করতে পারেন।
আহমেদ

2

অর্জনের সর্বোত্তম উপায় হ'ল সংজ্ঞা দেওয়া __slots__। এইভাবে আপনার দৃষ্টান্তগুলিতে নতুন বৈশিষ্ট্য থাকতে পারে না।

ks = ['ab', 'cd']
vs = [12, 34]

class C(dict):
    __slots__ = []
    def __init__(self, ks, vs): self.update(zip(ks, vs))
    def __getattr__(self, key): return self[key]

if __name__ == "__main__":
    c = C(ks, vs)
    print c.ab

প্রিন্ট 12

    c.ab = 33

এটি দেয়: AttributeError: 'C' object has no attribute 'ab'


2

পছন্দসই প্রভাব কীভাবে অর্জন করতে হয় তার অন্য একটি উদাহরণ

class Foo(object):

    _bar = None

    @property
    def bar(self):
        return self._bar

    @bar.setter
    def bar(self, value):
        self._bar = value

    def __init__(self, dyn_property_name):
        setattr(Foo, dyn_property_name, Foo.bar)

সুতরাং এখন আমরা এই জাতীয় জিনিসগুলি করতে পারি:

>>> foo = Foo('baz')
>>> foo.baz = 5
>>> foo.bar
5
>>> foo.baz
5

2

এখানে একটি সমাধান যা:

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

শ্রেণিটি সংজ্ঞায়িত হওয়ার পরে, আপনি কেবল এটিতে কোনও সম্পত্তি যুক্ত করার জন্য এটি করুন:

setattr(SomeClass, 'propertyName', property(getter, setter))

পাইথন 3 এ পরীক্ষা করা এখানে একটি সম্পূর্ণ উদাহরণ রয়েছে:

#!/usr/bin/env python3

class Foo():
  pass

def get_x(self):
  return 3

def set_x(self, value):
  print("set x on %s to %d" % (self, value))

setattr(Foo, 'x', property(get_x, set_x))

foo1 = Foo()
foo1.x = 12
print(foo1.x)

1

আপনি অভিধানের শব্দটি ব্যবহার করে শ্রেণি বৈশিষ্ট্যগুলি আপডেট করতে নিম্নলিখিত কোডটি ব্যবহার করতে পারেন:

class ExampleClass():
    def __init__(self, argv):
        for key, val in argv.items():
            self.__dict__[key] = val

if __name__ == '__main__':
    argv = {'intro': 'Hello World!'}
    instance = ExampleClass(argv)
    print instance.intro

1

এটি ওপি যা চেয়েছিল তার থেকে কিছুটা আলাদা, তবে আমি একটি কার্যনির্বাহী সমাধান না পাওয়া পর্যন্ত আমার মস্তিষ্ককে ছিঁড়ে ফেলেছি, তাই আমি পরের লোক / গ্যালের জন্য এখানে রাখছি

গতিশীল সেটার এবং গিটারগুলি নির্দিষ্ট করার জন্য আমার একটি উপায় প্রয়োজন।

class X:
    def __init__(self, a=0, b=0, c=0):
        self.a = a
        self.b = b
        self.c = c

    @classmethod
    def _make_properties(cls, field_name, inc):
        _inc = inc

        def _get_properties(self):
            if not hasattr(self, '_%s_inc' % field_name):
                setattr(self, '_%s_inc' % field_name, _inc)
                inc = _inc
            else:
                inc = getattr(self, '_%s_inc' % field_name)

            return getattr(self, field_name) + inc

        def _set_properties(self, value):
            setattr(self, '_%s_inc' % field_name, value)

        return property(_get_properties, _set_properties)

আমি আমার ক্ষেত্রগুলি আগেই জানি তাই আমি আমার সম্পত্তি তৈরি করতে যাচ্ছি। দ্রষ্টব্য: আপনি এই PER উদাহরণটি করতে পারবেন না, এই বৈশিষ্ট্যগুলি ক্লাসে উপস্থিত থাকবে !!!

for inc, field in enumerate(['a', 'b', 'c']):
    setattr(X, '%s_summed' % field, X._make_properties(field, inc))

আসুন এখনই এটি পরীক্ষা করি ..

x = X()
assert x.a == 0
assert x.b == 0
assert x.c == 0

assert x.a_summed == 0  # enumerate() set inc to 0 + 0 = 0
assert x.b_summed == 1  # enumerate() set inc to 1 + 0 = 1
assert x.c_summed == 2  # enumerate() set inc to 2 + 0 = 2

# we set the variables to something
x.a = 1
x.b = 2
x.c = 3

assert x.a_summed == 1  # enumerate() set inc to 0 + 1 = 1
assert x.b_summed == 3  # enumerate() set inc to 1 + 2 = 3
assert x.c_summed == 5  # enumerate() set inc to 2 + 3 = 5

# we're changing the inc now
x.a_summed = 1 
x.b_summed = 3 
x.c_summed = 5

assert x.a_summed == 2  # we set inc to 1 + the property was 1 = 2
assert x.b_summed == 5  # we set inc to 3 + the property was 2 = 5
assert x.c_summed == 8  # we set inc to 5 + the property was 3 = 8

এটা কি বিভ্রান্তিকর? হ্যাঁ, দুঃখিত, আমি কোনও অর্থপূর্ণ বাস্তব বিশ্বের উদাহরণ নিয়ে আসতে পারিনি। এছাড়াও, এটি হালকা হৃদয়ের জন্য নয়।


আমি যদি সঠিকভাবে স্মরণ করি তবে আমার সমস্ত পরীক্ষার সময় একটি স্ট্যাটিক ধরণের সম্পত্তি / গতিশীলভাবে যুক্ত জি / সেটার তৈরির জন্য আমি একটি উপায় খুঁজে পেয়েছি। আমাকে আমার আগের সমস্তগুলি দিয়ে যেতে হয়েছিল - তবে এমন কিছু যুক্ত করতে সক্ষম হওয়া যা সমস্ত দৃষ্টান্তের মধ্যে ভাগ করে নেওয়া অবশ্যই সম্ভব। প্রতি-ইনস্ট্যান্স প্রক্রিয়া তৈরি করার জন্য ... আমি দৃ pretty়ভাবে নিশ্চিত যে আপনি এটি করতে পারেন যাতে একটি উদাহরণে অন্যরকম কিছু থাকে না। আমাকে যাচাই করতে হবে, তবে আমি এ জাতীয় কিছুতেও ছুটে এসেছি (আমার প্রথম প্রয়াসে আমি একটি ভুল করেছি যার ফলে ফাংশনগুলি তৈরি হয়েছিল, তবে কোনও ত্রুটির কারণে সমস্ত ঘটনা
ঘটেনি

এছাড়াও, প্রতিটি সম্ভাব্য সমাধান স্বাগত কারণ এটি জ্ঞানের একটি রেপো। বিভিন্ন ব্যক্তি সমস্যার সমাধান তৈরি করার বিভিন্ন উপায়ে দেখতেও আকর্ষণীয়। আমার সমাধানটি প্রচুর পরিমাণে করে, আপনি এটিকে ভাগ করে নেওয়ার মতো সহজ কিছুতে ঝুঁকিয়েছিলেন। আমিও আমার একটি ছোট বৈকল্পিকটি করেছি - এটি এই বিষয়টির কোথাও হওয়া উচিত - এবং আমি কেবল বুঝতে পেরেছিলাম যে এটি আমার পোস্ট করা নয়: -) ...
এস্কুল

0

এটি কাজ করে বলে মনে হচ্ছে (তবে নীচে দেখুন):

class data(dict,object):
    def __init__(self,*args,**argd):
        dict.__init__(self,*args,**argd)
        self.__dict__.update(self)
    def __setattr__(self,name,value):
        raise AttributeError,"Attribute '%s' of '%s' object cannot be set"%(name,self.__class__.__name__)
    def __delattr__(self,name):
        raise AttributeError,"Attribute '%s' of '%s' object cannot be deleted"%(name,self.__class__.__name__)

আপনার যদি আরও জটিল আচরণের প্রয়োজন হয় তবে নির্দ্বিধায় নিজের উত্তরটি সম্পাদনা করুন।

সম্পাদন করা

নিম্নলিখিতগুলি সম্ভবত বড় ডেটাসেটগুলির জন্য আরও মেমরি-দক্ষ হবে:

class data(dict,object):
    def __init__(self,*args,**argd):
        dict.__init__(self,*args,**argd)
    def __getattr__(self,name):
        return self[name]
    def __setattr__(self,name,value):
        raise AttributeError,"Attribute '%s' of '%s' object cannot be set"%(name,self.__class__.__name__)
    def __delattr__(self,name):
        raise AttributeError,"Attribute '%s' of '%s' object cannot be deleted"%(name,self.__class__.__name__)

0

আপনার প্রশ্নের মূল জোয়ারের উত্তর দিতে, আপনি অপরিবর্তনীয় ডেটাসোর্স হিসাবে ডিকের কাছ থেকে কেবল পঠনযোগ্য বৈশিষ্ট্যটি চান:

লক্ষ্যটি একটি মক ক্লাস তৈরি করা যা ডিবি রেজাল্টের মতো আচরণ করে।

সুতরাং উদাহরণস্বরূপ, যদি কোনও ডাটাবেস কোয়েরি যদি একটি ডিক এক্সপ্রেশন ব্যবহার করে ফিরে আসে {'ab':100, 'cd':200}, তবে আমি দেখতে চাই

>>> dummy.ab
100

কেবলমাত্র এটি সম্পাদন করতে namedtupleআমি collectionsমডিউল থেকে কীভাবে ব্যবহার করব তা আমি প্রদর্শন করব :

import collections

data = {'ab':100, 'cd':200}

def maketuple(d):
    '''given a dict, return a namedtuple'''
    Tup = collections.namedtuple('TupName', d.keys()) # iterkeys in Python2
    return Tup(**d)

dummy = maketuple(data)
dummy.ab

আয় 100


0
class atdict(dict):
  def __init__(self, value, **kwargs):
    super().__init__(**kwargs)
    self.__dict = value

  def __getattr__(self, name):
    for key in self.__dict:
      if type(self.__dict[key]) is list:
        for idx, item in enumerate(self.__dict[key]):
          if type(item) is dict:
            self.__dict[key][idx] = atdict(item)
      if type(self.__dict[key]) is dict:
        self.__dict[key] = atdict(self.__dict[key])
    return self.__dict[name]



d1 = atdict({'a' : {'b': [{'c': 1}, 2]}})

print(d1.a.b[0].c)

এবং আউটপুটটি হ'ল:

>> 1

0

কেজেফ্লেচ থেকে ধারণাটি প্রসারিত করা হচ্ছে

# This is my humble contribution, extending the idea to serialize
# data from and to tuples, comparison operations and allowing functions
# as default values.

def Struct(*args, **kwargs):
    FUNCTIONS = (types.BuiltinFunctionType, types.BuiltinMethodType, \
                 types.FunctionType, types.MethodType)
    def init(self, *iargs, **ikwargs):
        """Asume that unamed args are placed in the same order than
        astuple() yields (currently alphabetic order)
        """
        kw = list(self.__slots__)

        # set the unnamed args
        for i in range(len(iargs)):
            k = kw.pop(0)
            setattr(self, k, iargs[i])

        # set the named args
        for k, v in ikwargs.items():
            setattr(self, k, v)
            kw.remove(k)

        # set default values
        for k in kw:
            v = kwargs[k]
            if isinstance(v, FUNCTIONS):
                v = v()
            setattr(self, k, v)

    def astuple(self):
        return tuple([getattr(self, k) for k in self.__slots__])

    def __str__(self):
        data = ['{}={}'.format(k, getattr(self, k)) for k in self.__slots__]
        return '<{}: {}>'.format(self.__class__.__name__, ', '.join(data))

    def __repr__(self):
        return str(self)

    def __eq__(self, other):
        return self.astuple() == other.astuple()

    name = kwargs.pop("__name__", "MyStruct")
    slots = list(args)
    slots.extend(kwargs.keys())
    # set non-specific default values to None
    kwargs.update(dict((k, None) for k in args))

    return type(name, (object,), {
        '__init__': init,
        '__slots__': tuple(slots),
        'astuple': astuple,
        '__str__': __str__,
        '__repr__': __repr__,
        '__eq__': __eq__,
    })


Event = Struct('user', 'cmd', \
               'arg1', 'arg2',  \
               date=time.time, \
               __name__='Event')

aa = Event('pepe', 77)
print(aa)
raw = aa.astuple()

bb = Event(*raw)
print(bb)

if aa == bb:
    print('Are equals')

cc = Event(cmd='foo')
print(cc)

আউটপুট:

<Event: user=pepe, cmd=77, arg1=None, arg2=None, date=1550051398.3651814>
<Event: user=pepe, cmd=77, arg1=None, arg2=None, date=1550051398.3651814>
Are equals
<Event: user=None, cmd=foo, arg1=None, arg2=None, date=1550051403.7938335>

0

যদিও অনেক উত্তর দেওয়া হয়েছে, আমি খুশি এমন একটি খুঁজে পাইনি। আমি আমার নিজস্ব সমাধান বের করেছিলাম যা propertyগতিশীল ক্ষেত্রে কাজ করে। মূল প্রশ্নের উত্তর দেওয়ার উত্স:

#!/usr/local/bin/python3

INITS = { 'ab': 100, 'cd': 200 }

class DP(dict):
  def __init__(self):
    super().__init__()
    for k,v in INITS.items():
        self[k] = v 

def _dict_set(dp, key, value):
  dp[key] = value

for item in INITS.keys():
  setattr(
    DP,
    item,
    lambda key: property(
      lambda self: self[key], lambda self, value: _dict_set(self, key, value)
    )(item)
  )

a = DP()
print(a)  # {'ab': 100, 'cd': 200}
a.ab = 'ab100'
a.cd = False
print(a.ab, a.cd) # ab100 False

0

আমার পক্ষে কাজ করে এমন কিছু হ'ল:

class C:
    def __init__(self):
        self._x=None

    def g(self):
        return self._x

    def s(self, x):
        self._x = x

    def d(self):
        del self._x

    def s2(self,x):
        self._x=x+x

    x=property(g,s,d)


c = C()
c.x="a"
print(c.x)

C.x=property(C.g, C.s2)
C.x=C.x.deleter(C.d)
c2 = C()
c2.x="a"
print(c2.x)

আউটপুট

a
aa

-1

আমি সম্প্রতি একটি অনুরূপ সমস্যাতে পড়েছি, সমাধান যে আমি ব্যবহার নিয়ে এসেছেন __getattr__এবং __setattr__বৈশিষ্ট্য যে আমি এটা হ্যান্ডেল করতে চান তাদের জন্য, অন্য সব কিছুর মুল কাছে হস্তান্তর হয়।

class C(object):
    def __init__(self, properties):
        self.existing = "Still Here"
        self.properties = properties

    def __getattr__(self, name):
        if "properties" in self.__dict__ and name in self.properties:
            return self.properties[name] # Or call a function, etc
        return self.__dict__[name]

    def __setattr__(self, name, value):
        if "properties" in self.__dict__ and name in self.properties:
            self.properties[name] = value
        else:
            self.__dict__[name] = value

if __name__ == "__main__":
    my_properties = {'a':1, 'b':2, 'c':3}
    c = C(my_properties)
    assert c.a == 1
    assert c.existing == "Still Here"
    c.b = 10
    assert c.properties['b'] == 10

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

অর্থাত্: আমাকে হয় একটি বেস ক্লাস তৈরি করতে হবে যা আমি আমার বাচ্চাদের সমস্ত প্রসারিত করি যা থেকে সিস্টেমটি ব্যবহার করে, বা আমাকে সমস্ত কিছুতে s / getattr ম্যাজিক ফাংশন যুক্ত করতে হবে এবং প্রতিবারে সিস্টেমটিকে নকল করতে হবে। বৈশিষ্ট্যগুলি ঘোষণার অর্থ হ'ল আপনাকে এগুলি একটি উপায়ে সেট আপ করতে হবে, এবং যদি আপনি অতিরিক্ত কোনও সমর্থন চান, যেমন আমি তালিকাবদ্ধ করেছি যেমন ডেটা-টাইপ এবং অথবা মান সুরক্ষা হিসাবে ডেটা নির্ধারিত বা অন্যান্য সহায়ক হতে বা সংরক্ষণ করতে বাধা দিতে , তারপরে আপনাকে সেগুলিতে কোড করতে হবে ted মঞ্জুর, আপনি আচরণকে সিস্টেমটিকে একই রকম করতে পারেন তবে আপনি যেখানে কিছুটা আলাদা এবং বাল্কিয়ার ঘোষণা করেন সেখানেই এটি শেষ হয়।
এস্কুল

-1

প্রোগ্রামটিমেটিকভাবে সম্পত্তি বস্তু তৈরির সহজ উদাহরণ এখানে।

#!/usr/bin/python3

class Counter:
    def __init__(self):
        cls = self.__class__
        self._count = 0
        cls.count = self.count_ref()

    def count_get(self):
        print(f'count_get: {self._count}')
        return self._count

    def count_set(self, value):
        self._count = value
        print(f'count_set: {self._count}')

    def count_del(self):
        print(f'count_del: {self._count}')

    def count_ref(self):
        cls = self.__class__
        return property(fget=cls.count_get, fset=cls.count_set, fdel=cls.count_del)

counter = Counter()

counter.count
for i in range(5):
    counter.count = i
del counter.count

'''
output
======
count_get: 0
count_set: 0
count_set: 1
count_set: 2
count_set: 3
count_set: 4
count_del: 4
'''

-2

কোনও সম্পত্তি গতিশীলভাবে সংযুক্ত করার একমাত্র উপায় হ'ল আপনার নতুন সম্পত্তির সাথে একটি নতুন বর্গ এবং এর উদাহরণ তৈরি করা।

class Holder: p = property(lambda x: vs[i], self.fn_readonly)
setattr(self, k, Holder().p)

1
এটি কাজ করে না। এটি সম্পত্তির ফলাফল নির্ধারণ করবে, সম্পত্তি নিজেই নয়।
mjallday

এটি ভুল। আমি ক্লাসটি আরম্ভ না করেই আমার সিস্টেমের সাথে গতিশীল বৈশিষ্ট্যগুলি সংযুক্ত করি। এক্স = উদাহরণ () হওয়ার পরে আরম্ভ করুন, তারপরে এক্সটিতে সম্পত্তি যুক্ত করুন।
এস্কুল

আপনি যদি আমার কোডটি দেখেন, আপনি দেখতে পাবেন যে আমি ক্লাস উদাহরণবেস: পাস, ক্লাসের উদাহরণ (উদাহরণস্বরূপ) ব্যবহার করেছি: ... তারপর আমি বৈশিষ্ট্যগুলিকে উদাহরণস্বরূপে সংযুক্ত করি, কারণ নামটি তখন বিদ্যমান, এবং যেহেতু উদাহরণটি এর থেকে প্রসারিত হয়, এটি সব কিছু অ্যাক্সেস আছে। অ্যাকসেসর সহায়তায় অ্যাক্সেসরের বস্তুগুলিতে সরাসরি অ্যাক্সেস পেতে সক্ষম হওয়ার জন্য আমি __ var ব্যবহার করি, আমি সঞ্চিত ডেটা (কাঁচা) এর জন্য _ ব্যবহার করি যা কোনওটিই হতে পারে না এবং আসল সম্পত্তি যা প্রাপ্তির মধ্য দিয়ে যায় তার জন্য কোনও আন্ডারস্কোর নেই। আমি গতিশীল যুক্ত ফাংশন ব্যবহার করে গেটর ফাংশনটি কল করতে পারি, বা সম্পত্তিটি ব্যবহার করতে পারি। সবার আগে দীক্ষা না করে।
এস্কুল

দ্রষ্টব্য: আমি এটি উল্লেখ করেছি - তবে সংজ্ঞার জন্য আমার সংজ্ঞাটির অর্থ রেফারেন্স নেমস্পেসে বিদ্যমান - যেমন: শ্রেণীর উদাহরণ (অবজেক্ট): পাস ... এটি বিদ্যমান, তবে আরম্ভ করা হয়নি। ইনিশিয়ালেশন অর্থ ব্লাহ = উদাহরণ (); এখন অবজেক্টটি 'নকল' হয়েছে এবং এটি নির্মাণ করা হয়েছে, তারপরে ব্লেহে রেফারেন্স হিসাবে সংরক্ষণ করা হবে। --- আপনি যদি এটি করেন, তবে গতিশীলভাবে যুক্ত ফাংশন / বৈশিষ্ট্যগুলি কেবলমাত্র উদাহরণ হিসাবে থাকা উচিত - এটির সাথে আমার যে সমস্যাটি ছিল তা ছিল এমনকি যদি ফাংশনগুলি বিদ্যমান থাকে তবে এমন ঘটনাও ঘটেছিল যেখানে আমি তা না করে বলে ত্রুটি পেয়েছি। হয় ব্লকিং ত্রুটি সৃষ্টি থামিয়েছে, বা অ্যাসিঙ্ক এক্সিকিউশন।
এসেকুল

কয়েকটি অন্যান্য নোট: গতিসম্পন্ন বৈশিষ্ট্য তৈরি করা সম্ভব, এবং কেবল উদাহরণস্বরূপ বিদ্যমান এমন উপায়ে কাজ করা। আপনি এগুলিকে তৈরি করতে পারেন যাতে তারা বস্তুর জন্য উপস্থিত থাকে (যা আপনি বেশিরভাগ ক্ষেত্রে চান)। এবং এমন কেস রয়েছে যেখানে যুক্ত উপাদানগুলি 'স্থিতিশীল', অর্থাত্ একই তথ্যসূত্র, এবং প্রত্যাবর্তিত মানগুলি সমস্ত দৃষ্টান্তে ভাগ করা হয় - আপনি যদি কোনও একটি অঞ্চলে আপডেট করেন তবে
সমস্তগুলি

-6

সরবরাহিত উত্তরের অনেকগুলি সম্পত্তির জন্য অনেকগুলি লাইন প্রয়োজন, অর্থাত্ / এবং / অথবা - একাধিক সম্পত্তির জন্য পুনরাবৃত্তির কারণে আমি কী কুৎসিত বা ক্লান্তিকর প্রয়োগ বিবেচনা করি, ইত্যাদি। আমি ফুটন্ত জিনিসগুলি নীচে রেখে / সরানো পর্যন্ত তাদের পছন্দ করি আর সরল করা যায় না যতক্ষণ না এটি এটি করার জন্য বেশি উদ্দেশ্য করে না।

সংক্ষেপে: সমাপ্ত কাজগুলিতে, আমি যদি কোডের 2 লাইনের পুনরাবৃত্তি করি, তবে আমি সাধারণত এটিকে একটি একক লাইন সহায়ক ফাংশনে রূপান্তর করি এবং তাই ... আমি গণিত বা বিজোড় যুক্তিগুলি (স্টার্ট_এক্স, স্টার্ট_ই, এন্ড_ এক্স, এন্ড_ই) এর মতো করে সরলীকৃত করি (x, y, w, h) অর্থাত্ x, y, x + w, y + h (কখনও কখনও নূন্যতম / সর্বোচ্চ প্রয়োজন হয় বা যদি ডাব্লু / ঘন্টা নেতিবাচক থাকে এবং বাস্তবায়ন পছন্দ না করে, আমি এক্স / থেকে বিয়োগ করব) y এবং অ্যাবস ডাব্লু / এইচ। ইত্যাদি।)।

অভ্যন্তরীণ getters / setters ওভাররাইড করা একটি ভাল উপায়, কিন্তু সমস্যা আপনি প্রতিটি ক্লাসের জন্য যে প্রয়োজন, বা ক্লাস যে বেসে পিতামাতার ... এটি আমার পক্ষে কাজ করবে না কারণ আমি পছন্দ করব উত্তরাধিকার, শিশু নোড ইত্যাদির জন্য বাচ্চাদের / পিতামাতাদের চয়ন করতে বিনামূল্যে

আমি একটি সমাধান তৈরি করেছি যা ডেটা সরবরাহের জন্য ডিক্ট ডেটা-টাইপ ব্যবহার না করেই প্রশ্নের উত্তর দেয় কারণ আমি দেখতে পেয়েছি যে ডেটা প্রবেশ করানো ক্লান্তিকর হতে পারে ইত্যাদি ...

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

আপনার কাছে _object.x, _object.x = মান, _object.GetX (), _object.SetX (মান) ব্যবহার করার বিকল্প রয়েছে এবং সেগুলি সমানভাবে পরিচালিত হয়।

তদ্ব্যতীত, মানগুলি হ'ল একমাত্র স্থিতিশীল ডেটা যা শ্রেণীর উদাহরণ হিসাবে বরাদ্দ করা হয়, তবে আসল সম্পত্তি শ্রেণীর কাছে বরাদ্দ করা হয় যার অর্থ আপনি পুনরাবৃত্তি করতে চান না, পুনরাবৃত্তি করার দরকার নেই ... আপনি একটি ডিফল্ট মান বরাদ্দ করতে পারে তাই প্রতিবার গ্রাহকের এটির প্রয়োজন হয় না, যদিও সেখানে ডিফল্ট ডিফল্ট মানকে ওভাররাইড করার জন্য একটি বিকল্প রয়েছে এবং সেখানে আরও একটি বিকল্প রয়েছে যাতে গ্রাহক ডিফল্ট রিটার্নগুলিকে ওভাররাইড করে কাঁচা সঞ্চিত মান ফেরত দেয় (দ্রষ্টব্য: এই পদ্ধতিটি মানে কাঁচা মান কেবল তখনই নির্ধারিত হয় যখন কোনও মান নির্ধারিত হয়, অন্যথায় এটি কোনওটিই নয় - যখন মানটি পুনরায় সেট করা হয়, তখন এটি কোনও কিছুই বরাদ্দ করে না))

অনেক সাহায্যকারী ফাংশনও রয়েছে - প্রথম সম্পত্তি যা যুক্ত হয় উদাহরণের মানগুলি উল্লেখ করার জন্য ক্লাসে 2 বা আরও সাহায্যকারী যুক্ত করে ... সেগুলি রিসেটএ্যাকসেসর (_কি, ..) পুনরাবৃত্তি হয় (সমস্ত প্রথম নামযুক্ত আরোগুলি ব্যবহার করে পুনরাবৃত্তি করা যেতে পারে) ) এবং সেটএ্যাক্সেসরস (_কি, _ভ্যালু) দক্ষতার সহায়তায় মূল শ্রেণিতে আরও যুক্ত হওয়ার বিকল্প রয়েছে - পরিকল্পনা করা পরিকল্পনাগুলি হ'ল একসাথে গ্রুপ অ্যাক্সেসরদের উপায়, তাই যদি আপনি একবারে কয়েকটি রিসেট করতে চান তবে , আপনি তাদের একটি গোষ্ঠীতে অর্পণ করতে পারেন এবং প্রতিবার নামযুক্ত কীগুলি পুনরাবৃত্তি করার পরিবর্তে এবং আরও অনেক কিছুতে গ্রুপটি পুনরায় সেট করতে পারেন।

উদাহরণ / কাঁচা সঞ্চিত মান শ্রেণিতে সঞ্চয় করা হয় , শ্রেণী. অ্যাকসেসর ক্লাসটি রেফারেন্স করে যা সম্পত্তির জন্য স্ট্যাটিক ওয়ার্স / মান / ফাংশন ধারণ করে। _class। সে সম্পত্তি যা সেটিং / প্রাপ্তি ইত্যাদির সময় উদাহরণ শ্রেণীর মাধ্যমে অ্যাক্সেস করার সময় বলা হয় property

অ্যাক্সেসর _ক্লাস .__ শ্রেণিতে নির্দেশ করে, তবে এটি অভ্যন্তরীণ হওয়ায় এটি ক্লাসে নির্ধারিত হওয়া দরকার যার কারণে আমি এটি নির্ধারণ করতে __Name = AccessorFunc (...) ব্যবহার করতে পছন্দ করেছি, অনেকগুলি optionচ্ছিক সহ সম্পত্তি প্রতি একক লাইন আর্গুমেন্টগুলি ব্যবহার করার জন্য (কীড ভেরাগগুলি ব্যবহার করে কারণ তারা সনাক্তকরণ এবং বজায় রাখতে আরও সহজ এবং দক্ষ))

আমি উল্লিখিত হিসাবে অনেকগুলি ফাংশনও তৈরি করি, যার মধ্যে কিছু অ্যাকসেসর ফাংশন তথ্য ব্যবহার করে তাই এটির কল করার দরকার নেই (এই মুহুর্তে এটি কিছুটা অসুবিধে হয় - ঠিক এখন আপনাকে _ক্লাস ব্যবহার করা দরকার un ফাংশননাম (_ক্লাস_ইনস্ট্যান্স) , আরগস) - স্ট্যাক / ট্রেসটি ব্যবহার করে আমি এই বিট ম্যারাথনটি চালিত ফাংশনগুলি যোগ করে, বা বস্তুটিতে অ্যাকসেসর যুক্ত করে এবং স্ব ব্যবহার করে (এটি চিহ্নিত করার জন্য এটির নামকরণ করেছি) উদাহরণটি উল্লেখ করে রেফারেন্সটি দখল করার জন্য দখল করেছিলাম they 'উদাহরণ স্বরূপ এবং পুনরায় অ্যাক্সেস ধরে রাখতে, অ্যাক্সেসরফঙ্ক ক্লাসের রেফারেন্স এবং ফাংশন সংজ্ঞাগুলির মধ্যে থেকে অন্যান্য তথ্য)।

এটি পুরোপুরি সম্পন্ন হয় নি, তবে এটি একটি দুর্দান্ত পাদদেশ। দ্রষ্টব্য: আপনি যদি বৈশিষ্ট্য তৈরি করতে __Name = অ্যাক্সেসরফঙ্ক (...) ব্যবহার না করেন তবে আপনার __ কীতে অ্যাক্সেস থাকবে না যদিও আমি এটি ডিআই ফাংশনের মধ্যে সংজ্ঞায়িত করেছি। আপনি যদি করেন তবে কোনও সমস্যা নেই।

এছাড়াও: দ্রষ্টব্য যে নাম এবং কী আলাদা ... নামটি 'ফর্মাল', যা ফাংশন নাম তৈরিতে ব্যবহৃত হয়, এবং কীটি ডেটা স্টোরেজ এবং অ্যাক্সেসের জন্য। যেমন _class.x যেখানে ছোট হাতের অক্ষর কী হয়, নামটি বড় হাতের এক্স হবে যাতে গেটএক্সের পরিবর্তে গেটএক্স () ফাংশন যা কিছুটা বিশ্রী দেখায়। এটি সেলফ.এক্সকে কাজ করতে এবং উপযুক্ত দেখাতে দেয়, তবে গেটএক্স () কে অনুমতি দেয় এবং উপযুক্ত দেখায়।

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

কী ব্যবহার করে ফাংশনগুলির বর্তমান তালিকা: এক্স, নাম: এক্স আউটপুট হিসাবে:

এটি কোনওভাবেই একটি বিস্তৃত তালিকা নয় - এমন কয়েকটি আছে যা পোস্ট করার সময় এটি তৈরি করে নি ...

_instance.SetAccessors( _key, _value [ , _key, _value ] .. )                   Instance Class Helper Function: Allows assigning many keys / values on a single line - useful for initial setup, or to minimize lines.    In short: Calls this.Set<Name>( _value ) for each _key / _value pairing.
_instance.ResetAccessors( _key [ , _key ] .. )                                 Instance Class Helper Function: Allows resetting many key stored values to None on a single line.                                           In short: Calls this.Reset<Name>() for each name provided.


Note: Functions below may list self.Get / Set / Name( _args ) - self is meant as the class instance reference in the cases below - coded as this in AccessorFuncBase Class.

this.GetX( _default_override = None, _ignore_defaults = False )                 GET:            Returns    IF ISSET: STORED_VALUE .. IF IGNORE_DEFAULTS: None  .. IF PROVIDED: DEFAULT_OVERRIDE ELSE: DEFAULT_VALUE       100
this.GetXRaw( )                                                                 RAW:            Returns    STORED_VALUE                                                                                                     100
this.IsXSet( )                                                                  ISSET:          Returns    ( STORED_VALUE != None )                                                                                         True

this.GetXToString( )                                                            GETSTR:         Returns    str( GET )                                                                                                       100
this.GetXLen( _default_override = None, _ignore_defaults = False )              LEN:            Returns    len( GET )                                                                                                       3
this.GetXLenToString( _default_override = None, _ignore_defaults = False )      LENSTR:         Returns    str( len( GET ) )                                                                                                3
this.GetXDefaultValue( )                                                        DEFAULT:        Returns    DEFAULT_VALUE                                                                                                    1111

this.GetXAccessor( )                                                            ACCESSOR:       Returns    ACCESSOR_REF ( self.__<key> )                                                                                    [ AccessorFuncBase ] Key: x : Class ID: 2231452344344 : self ID: 2231448283848        Default: 1111       Allowed Types: {"<class 'int'>": "<class 'type'>", "<class 'float'>": "<class 'type'>"}     Allowed Values: None
this.GetXAllowedTypes( )                                                        ALLOWED_TYPES:  Returns    Allowed Data-Types                                                                                               {"<class 'int'>": "<class 'type'>", "<class 'float'>": "<class 'type'>"}
this.GetXAllowedValues( )                                                       ALLOWED_VALUES: Returns    Allowed Values                                                                                                   None

this.GetXHelpers( )                                                             HELPERS:        Returns    Helper Functions String List - ie what you're reading now...                                                     THESE ROWS OF TEXT
this.GetXKeyOutput( )                                                           Returns information about this Name / Key                                                                                                   ROWS OF TEXT
this.GetXGetterOutput( )                                                        Returns information about this Name / Key                                                                                                   ROWS OF TEXT

this.SetX( _value )                                                             SET:            STORED_VALUE Setter - ie Redirect to __<Key>.Set                                                                            N / A
this.ResetX( )                                                                  RESET:          Resets STORED_VALUE to None                                                                                                 N / A

this.HasXGetterPrefix( )                                                        Returns Whether or Not this key has a Getter Prefix...                                                                                      True
this.GetXGetterPrefix( )                                                        Returns Getter Prefix...                                                                                                                    Get

this.GetXName( )                                                                Returns Accessor Name - Typically Formal / Title-Case                                                                                       X
this.GetXKey( )                                                                 Returns Accessor Property Key - Typically Lower-Case                                                                                        x
this.GetXAccessorKey( )                                                         Returns Accessor Key - This is to access internal functions, and static data...                                                             __x
this.GetXDataKey( )                                                             Returns Accessor Data-Storage Key - This is the location where the class instance value is stored..                                         _x

আউটপুট হচ্ছে এমন কিছু ডেটা হ'ল:

নাম ব্যতীত অন্য কোনও ডেটা ছাড়াই ডেমো ক্লাস ব্যবহার করে তৈরি করা একেবারে নতুন শ্রেণীর জন্য এটি (যাতে এটি আউটপুট হতে পারে) যা _ফু, আমি যে পরিবর্তনশীল নামটি ব্যবহার করেছি ...

_foo         --- MyClass: ---- id( this.__class__ ): 2231452349064 :::: id( this ): 2231448475016

    Key       Getter Value        | Raw Key   Raw / Stored Value       | Get Default Value             Default Value            | Get Allowed Types             Allowed Types                                                              | Get Allowed Values            Allowed Values                                                                                                                                                                                                                   |

    Name:     _foo                | _Name:    _foo                     | __Name.DefaultValue( ):       AccessorFuncDemoClass    | __Name.GetAllowedTypes( )     <class 'str'>                                                              | __Name.GetAllowedValues( )    Saved Value Restrictions Levied by Data-Type                                                                                                                                                                                     |
    x:        1111                | _x:       None                     | __x.DefaultValue( ):          1111                     | __x.GetAllowedTypes( )        (<class 'int'>, <class 'float'>)                                           | __x.GetAllowedValues( )       Saved Value Restrictions Levied by Data-Type                                                                                                                                                                                     |
    y:        2222                | _y:       None                     | __y.DefaultValue( ):          2222                     | __y.GetAllowedTypes( )        (<class 'int'>, <class 'float'>)                                           | __y.GetAllowedValues( )       Saved Value Restrictions Levied by Data-Type                                                                                                                                                                                     |
    z:        3333                | _z:       None                     | __z.DefaultValue( ):          3333                     | __z.GetAllowedTypes( )        (<class 'int'>, <class 'float'>)                                           | __z.GetAllowedValues( )       Saved Value Restrictions Levied by Data-Type                                                                                                                                                                                     |
    Blah:     <class 'int'>       | _Blah:    None                     | __Blah.DefaultValue( ):       <class 'int'>            | __Blah.GetAllowedTypes( )     <class 'str'>                                                              | __Blah.GetAllowedValues( )    Saved Value Restrictions Levied by Data-Type                                                                                                                                                                                     |
    Width:    1                   | _Width:   None                     | __Width.DefaultValue( ):      1                        | __Width.GetAllowedTypes( )    (<class 'int'>, <class 'bool'>)                                            | __Width.GetAllowedValues( )   Saved Value Restrictions Levied by Data-Type                                                                                                                                                                                     |
    Height:   0                   | _Height:  None                     | __Height.DefaultValue( ):     0                        | __Height.GetAllowedTypes( )   <class 'int'>                                                              | __Height.GetAllowedValues( )  (0, 1, 2, 3, 4, 5, 6, 7, 8, 9)                                                                                                                                                                                                   |
    Depth:    2                   | _Depth:   None                     | __Depth.DefaultValue( ):      2                        | __Depth.GetAllowedTypes( )    Saved Value Restricted to Authorized Values ONLY                           | __Depth.GetAllowedValues( )   (0, 1, 2, 3, 4, 5, 6, 7, 8, 9)                                                                                                                                                                                                   |


this.IsNameSet( ):    True      this.GetName( ):     _foo                     this.GetNameRaw( ):    _foo                     this.GetNameDefaultValue( ):    AccessorFuncDemoClass    this.GetNameLen( ):    4    this.HasNameGetterPrefix( ):    <class 'str'>                                this.GetNameGetterPrefix( ):    None
this.IsXSet( ):       False     this.GetX( ):        1111                     this.GetXRaw( ):       None                     this.GetXDefaultValue( ):       1111                     this.GetXLen( ):       4    this.HasXGetterPrefix( ):       (<class 'int'>, <class 'float'>)             this.GetXGetterPrefix( ):       None
this.IsYSet( ):       False     this.GetY( ):        2222                     this.GetYRaw( ):       None                     this.GetYDefaultValue( ):       2222                     this.GetYLen( ):       4    this.HasYGetterPrefix( ):       (<class 'int'>, <class 'float'>)             this.GetYGetterPrefix( ):       None
this.IsZSet( ):       False     this.GetZ( ):        3333                     this.GetZRaw( ):       None                     this.GetZDefaultValue( ):       3333                     this.GetZLen( ):       4    this.HasZGetterPrefix( ):       (<class 'int'>, <class 'float'>)             this.GetZGetterPrefix( ):       None
this.IsBlahSet( ):    False     this.GetBlah( ):     <class 'int'>            this.GetBlahRaw( ):    None                     this.GetBlahDefaultValue( ):    <class 'int'>            this.GetBlahLen( ):    13   this.HasBlahGetterPrefix( ):    <class 'str'>                                this.GetBlahGetterPrefix( ):    None
this.IsWidthSet( ):   False     this.GetWidth( ):    1                        this.GetWidthRaw( ):   None                     this.GetWidthDefaultValue( ):   1                        this.GetWidthLen( ):   1    this.HasWidthGetterPrefix( ):   (<class 'int'>, <class 'bool'>)              this.GetWidthGetterPrefix( ):   None
this.IsDepthSet( ):   False     this.GetDepth( ):    2                        this.GetDepthRaw( ):   None                     this.GetDepthDefaultValue( ):   2                        this.GetDepthLen( ):   1    this.HasDepthGetterPrefix( ):   None                                         this.GetDepthGetterPrefix( ):   (0, 1, 2, 3, 4, 5, 6, 7, 8, 9)
this.IsHeightSet( ):  False     this.GetHeight( ):   0                        this.GetHeightRaw( ):  None                     this.GetHeightDefaultValue( ):  0                        this.GetHeightLen( ):  1    this.HasHeightGetterPrefix( ):  <class 'int'>                                this.GetHeightGetterPrefix( ):  (0, 1, 2, 3, 4, 5, 6, 7, 8, 9)

এবং এটি একই _ ক্রমে নিম্নোক্ত মানগুলি (নাম বাদে) প্রদানের পরে: 'স্ট্রিং', 1.0, সত্য, 9, 10, মিথ্যা

this.IsNameSet( ):    True      this.GetName( ):     _foo                     this.GetNameRaw( ):    _foo                     this.GetNameDefaultValue( ):    AccessorFuncDemoClass    this.GetNameLen( ):    4    this.HasNameGetterPrefix( ):    <class 'str'>                                this.GetNameGetterPrefix( ):    None
this.IsXSet( ):       True      this.GetX( ):        10                       this.GetXRaw( ):       10                       this.GetXDefaultValue( ):       1111                     this.GetXLen( ):       2    this.HasXGetterPrefix( ):       (<class 'int'>, <class 'float'>)             this.GetXGetterPrefix( ):       None
this.IsYSet( ):       True      this.GetY( ):        10                       this.GetYRaw( ):       10                       this.GetYDefaultValue( ):       2222                     this.GetYLen( ):       2    this.HasYGetterPrefix( ):       (<class 'int'>, <class 'float'>)             this.GetYGetterPrefix( ):       None
this.IsZSet( ):       True      this.GetZ( ):        10                       this.GetZRaw( ):       10                       this.GetZDefaultValue( ):       3333                     this.GetZLen( ):       2    this.HasZGetterPrefix( ):       (<class 'int'>, <class 'float'>)             this.GetZGetterPrefix( ):       None
this.IsBlahSet( ):    True      this.GetBlah( ):     string Blah              this.GetBlahRaw( ):    string Blah              this.GetBlahDefaultValue( ):    <class 'int'>            this.GetBlahLen( ):    11   this.HasBlahGetterPrefix( ):    <class 'str'>                                this.GetBlahGetterPrefix( ):    None
this.IsWidthSet( ):   True      this.GetWidth( ):    False                    this.GetWidthRaw( ):   False                    this.GetWidthDefaultValue( ):   1                        this.GetWidthLen( ):   5    this.HasWidthGetterPrefix( ):   (<class 'int'>, <class 'bool'>)              this.GetWidthGetterPrefix( ):   None
this.IsDepthSet( ):   True      this.GetDepth( ):    9                        this.GetDepthRaw( ):   9                        this.GetDepthDefaultValue( ):   2                        this.GetDepthLen( ):   1    this.HasDepthGetterPrefix( ):   None                                         this.GetDepthGetterPrefix( ):   (0, 1, 2, 3, 4, 5, 6, 7, 8, 9)
this.IsHeightSet( ):  True      this.GetHeight( ):   9                        this.GetHeightRaw( ):  9                        this.GetHeightDefaultValue( ):  0                        this.GetHeightLen( ):  1    this.HasHeightGetterPrefix( ):  <class 'int'>                                this.GetHeightGetterPrefix( ):  (0, 1, 2, 3, 4, 5, 6, 7, 8, 9)

_foo         --- MyClass: ---- id( this.__class__ ): 2231452349064 :::: id( this ): 2231448475016

    Key       Getter Value        | Raw Key   Raw / Stored Value       | Get Default Value             Default Value            | Get Allowed Types             Allowed Types                                                              | Get Allowed Values            Allowed Values                                                                                                                                                                                                                   |

    Name:     _foo                | _Name:    _foo                     | __Name.DefaultValue( ):       AccessorFuncDemoClass    | __Name.GetAllowedTypes( )     <class 'str'>                                                              | __Name.GetAllowedValues( )    Saved Value Restrictions Levied by Data-Type                                                                                                                                                                                     |
    x:        10                  | _x:       10                       | __x.DefaultValue( ):          1111                     | __x.GetAllowedTypes( )        (<class 'int'>, <class 'float'>)                                           | __x.GetAllowedValues( )       Saved Value Restrictions Levied by Data-Type                                                                                                                                                                                     |
    y:        10                  | _y:       10                       | __y.DefaultValue( ):          2222                     | __y.GetAllowedTypes( )        (<class 'int'>, <class 'float'>)                                           | __y.GetAllowedValues( )       Saved Value Restrictions Levied by Data-Type                                                                                                                                                                                     |
    z:        10                  | _z:       10                       | __z.DefaultValue( ):          3333                     | __z.GetAllowedTypes( )        (<class 'int'>, <class 'float'>)                                           | __z.GetAllowedValues( )       Saved Value Restrictions Levied by Data-Type                                                                                                                                                                                     |
    Blah:     string Blah         | _Blah:    string Blah              | __Blah.DefaultValue( ):       <class 'int'>            | __Blah.GetAllowedTypes( )     <class 'str'>                                                              | __Blah.GetAllowedValues( )    Saved Value Restrictions Levied by Data-Type                                                                                                                                                                                     |
    Width:    False               | _Width:   False                    | __Width.DefaultValue( ):      1                        | __Width.GetAllowedTypes( )    (<class 'int'>, <class 'bool'>)                                            | __Width.GetAllowedValues( )   Saved Value Restrictions Levied by Data-Type                                                                                                                                                                                     |
    Height:   9                   | _Height:  9                        | __Height.DefaultValue( ):     0                        | __Height.GetAllowedTypes( )   <class 'int'>                                                              | __Height.GetAllowedValues( )  (0, 1, 2, 3, 4, 5, 6, 7, 8, 9)                                                                                                                                                                                                   |
    Depth:    9                   | _Depth:   9                        | __Depth.DefaultValue( ):      2                        | __Depth.GetAllowedTypes( )    Saved Value Restricted to Authorized Values ONLY                           | __Depth.GetAllowedValues( )   (0, 1, 2, 3, 4, 5, 6, 7, 8, 9)                                                                                                                                                                                                   |

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

কোডটি এখানে পোস্ট করা হয়নি কারণ উদাহরণ এবং ব্যাখ্যাগুলির পরে আমার কাছে জায়গা ছিল না ... এছাড়াও কারণ এটি পরিবর্তন হবে।

দয়া করে নোট করুন: এই পোস্টিংয়ের সময় ফাইলটি অগোছালো - এটি পরিবর্তন হবে। তবে, আপনি যদি এটি সাব্লাইম পাঠ্যে চালনা করেন এবং এটি সংকলন করেন বা পাইথন থেকে চালনা করেন তবে এটি এক টন তথ্য সংকলন এবং থুতু ছুঁড়ে দেবে - অ্যাক্সেসরডিবি অংশটি সম্পন্ন হয়নি (যা প্রিন্ট গেটার্স এবং গেটকি আউটপুট সহায়কটি আপডেট করতে ব্যবহৃত হবে) ইনস্ট্যান্স ফাংশনে পরিবর্তিত হওয়ার সাথে সাথে ফাংশনগুলি সম্ভবত একক ফাংশনে রেখে নতুন নামকরণ করা হয়েছে - এটি দেখুন ..)

পরবর্তী: এটি চালানোর জন্য সমস্ত কিছুর প্রয়োজন হয় না - নীচের অংশে প্রচুর মন্তব্য করা জিনিসগুলি ডিবাগিংয়ের জন্য ব্যবহৃত আরও তথ্যের জন্য - আপনি এটি ডাউনলোড করার সময় এটি নাও থাকতে পারে। যদি তা হয় তবে আপনার আরও তথ্যের জন্য অসুবিধা এবং পুনরায় সংযোগ করতে সক্ষম হওয়া উচিত।

আমি মাইক্লাসবেস: পাস, মাইক্লাস (মাইক্লাসবেস) প্রয়োজনের জন্য প্রায় একটি কাজের সন্ধান করছি: ... - যদি আপনি কোনও সমাধানের বিষয়টি জানেন তবে পোস্ট করুন।

ক্লাসে প্রয়োজনীয় জিনিসগুলির মধ্যে __ লাইনগুলি - স্ট্রিং ডিবাগিংয়ের জন্য যেমন ডিআইপি - সেগুলি ডেমো ক্লাস থেকে সরানো যেতে পারে তবে আপনাকে নীচের কিছু লাইন মন্তব্য করতে বা মুছে ফেলতে হবে (_ফু / ২ / 3 ) ..

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

ফাইলের অংশ:

##
## MyClass Test AccessorFunc Implementation for Dynamic 1-line Parameters
##
class AccessorFuncDemoClassBase( ):
    pass
class AccessorFuncDemoClass( AccessorFuncDemoClassBase ):
    __Name      = AccessorFuncBase( parent = AccessorFuncDemoClassBase, name = 'Name',      default = 'AccessorFuncDemoClass',  allowed_types = ( TYPE_STRING ),                    allowed_values = VALUE_ANY,                 documentation = 'Name Docs',        getter_prefix = 'Get',  key = 'Name',       allow_erroneous_default = False,    options = { } )
    __x         = AccessorFuncBase( parent = AccessorFuncDemoClassBase, name = 'X',         default = 1111,                     allowed_types = ( TYPE_INTEGER, TYPE_FLOAT ),       allowed_values = VALUE_ANY,                 documentation = 'X Docs',           getter_prefix = 'Get',  key = 'x',          allow_erroneous_default = False,    options = { } )
    __Height    = AccessorFuncBase( parent = AccessorFuncDemoClassBase, name = 'Height',    default = 0,                        allowed_types = TYPE_INTEGER,                       allowed_values = VALUE_SINGLE_DIGITS,       documentation = 'Height Docs',      getter_prefix = 'Get',  key = 'Height',     allow_erroneous_default = False,    options = { } )

এই সৌন্দর্য অ্যাক্সেসরফঙ্কস / কলব্যাকস / ডেটা-টাইপ / মান প্রয়োগকরণ ইত্যাদির সাথে গতিযুক্ত যুক্ত বৈশিষ্ট্য সহ নতুন ক্লাস তৈরি করা অবিশ্বাস্যরকম সহজ করে তোলে

আপাতত, লিঙ্কটি এখানে রয়েছে (এই লিঙ্কটি নথির পরিবর্তনগুলি প্রতিবিম্বিত করা উচিত)): https : //www.DPboxboxss/6gzi44i7dh58v61/dynamic_properties_accessorfuncs_and_more.py?dl=0

এছাড়াও: আপনি যদি সাব্লাইম টেক্সট ব্যবহার না করেন তবে আমি নোটপ্যাড ++, পরমাণু, ভিজ্যুয়াল কোড এবং অন্যদের উপরে এটির সুপারিশ করছি কারণ সঠিক থ্রেডিং প্রয়োগকরণ এটি ব্যবহার করার চেয়ে আরও দ্রুত তৈরি করেছে ... আমি আইডিই-জাতীয় কোডেও কাজ করছি এর জন্য ম্যাপিং সিস্টেম - একবার দেখুন: https://bitbucket.org/Acecool/acecoolcodemappingsystem/src/master/ (প্রথমে প্যাকেজ ম্যানেজারে রেপো যুক্ত করুন, তারপরে প্লাগইন ইনস্টল করুন - যখন সংস্করণ 1.0.0 প্রস্তুত হবে, আমি যুক্ত করব এটি মূল প্লাগইন তালিকায় ...)

আমি আশা করি এই সমাধানটি সর্বদা হিসাবে ... এবং, সহায়তা করে:

এটি কাজ করে বলে, এটি সঠিক করে না - জোশ 'এস্কুল' মোজার r


ক্লাসটি কেমন দেখাচ্ছে তার একটি দ্রুত প্রদর্শন যোগ করতে চেয়েছিলাম যাতে আপনার কোড ফাইলটি খোলার দরকার নেই তবে মন্তব্যগুলি সমর্থন করার জন্য উপস্থিত হয় না ..
এসেকুল

স্পষ্টতই এটি প্রচুর ঘৃণা পাচ্ছে, যা বিভ্রান্তিকর। এটি ওপি যা যা জিজ্ঞাসা করছে ঠিক তা করে - গতিশীলভাবে কোনও বস্তুতে বৈশিষ্ট্য যুক্ত করে। এটি সহায়ক ফাংশনগুলিও যুক্ত করে, যা অন্তর্ভুক্ত করতে হবে না - সম্ভবত এ কারণেই এটি ঘৃণা হচ্ছে - এবং এটিও নিশ্চিত করে যে বিকাশকারী দ্বারা সম্পত্তি (.x) অ্যাক্সেস করার সহজ উপায় রয়েছে যা প্রাপ্তির মাধ্যমে প্রক্রিয়া করা হয়, কাঁচা মান সঞ্চিত (._x) যা কখনই না হতে পারে যখন .x ডিফল্ট বা অন্য কিছু ফেরত দেয় এবং অ্যাক্সেসরে অ্যাক্সেসের সাহায্যকারীদের ব্যবহার, জিনিস বদল ইত্যাদির একটি উপায় ....
.__
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.