كيفية إنشاء خاصية باسمها في سلسلة؟
-
06-07-2019 - |
سؤال
باستخدام Python، أريد إنشاء خاصية في فصل دراسي، ولكن مع وجود اسمها في سلسلة.عادة ما تفعل:
blah = property(get_blah, set_blah, del_blah, "bleh blih")
حيث تم تعريف get_ وset_ وdel_blah وفقًا لذلك.لقد حاولت أن أفعل الشيء نفسه مع اسم الخاصية في متغير، مثل هذا:
setattr(self, "blah", property(self.get_blah, self.set_blah, self.del_blah, "bleh blih"))
ولكن هذا لا يعمل.الحالة الأولى بلاه تُرجع قيمة العقار، وفي الحالة الثانية تُرجع عقارًا، أي <property object at 0xbb1aa0>
.كيف يجب أن أعرفه حتى يعمل؟
المحلول
وبقدر أود أن أقول، والفرق هو أنه في النسخة الأولى، يمكنك تغيير الطبقات السمة بلاه إلى نتيجة الممتلكات وفي الثانية قمت بتعيين أنه في المثال (والذي هو مختلف!).
وماذا عن هذا الإصدار:
setattr(MyClass, "blah", property(self.get_blah, self.set_blah,
self.del_blah, "bleh blih"))
ويمكنك أيضا القيام بذلك:
setattr(type(self), "blah", property(self.get_blah, self.set_blah,
self.del_blah, "bleh blih"))
نصائح أخرى
وطريقة واحدة هي أن يكتب إلى السكان المحليين ():
class X:
for attr in ["a","b","c"]:
def getter(self, name=attr):
return name+"_value"
locals()[attr] = property(getter, None, None, attr)
x = X()
print x.a
print x.b
print x.c
وتعطي
a_value
b_value
c_value
إذا فهمت ما تحاول القيام به، فيمكنك إنجازه عن طريق تجاوز الفصل الدراسي getattr و setattr طُرق.
على سبيل المثال:
class Something(object):
def __getattr__(self, name):
# The name of the property retrieved is a string called name
return "You're getting %s" % name
something = Something()
print something.foo
print something.bar
سوف طباعة:
You're getting foo
You're getting bar
بهذه الطريقة يمكنك الحصول على أداة getter وSetter عامة تحتوي على اسم الخاصية في سلسلة وتفعل شيئًا بها وفقًا لذلك.