سمات الطبقة إعادة تعيين عند استيرادها من حزمة
سؤال
لدي مشروع تنظيم شيئا مثل
project/
__init__.py
builder.py
component/
__init__.py
داخل builder.py
, لدي فئة تسمى البناء التي لديها العديد من سمات الطبقة من أجل تنفيذ بورغ نمط.المشكلة تنشأ عند محاولة استيراد باني في component/__init__.py
وإجراء تغييرات على سمات الطبقة.ويبدو أنه مهما كانت التغييرات التي قمت بإجرائها إلى سمات الطبقة في الحزمة يتم التراجع عندما ترجع الدالة.
تحديث:هنا مثال بسيط لما يحدث.
builder.py
class Builder(object):
attribute = True
import component
print Builder.attribute
component/___init___.py
from project.builder import Builder
Builder.attribute = False
الإخراج:
False
True
اذا حكمنا من خلال حقيقة أن اثنين من خطوط المطبوعة ، وأود أن أعتقد أن الرمز في builder.py
ويجري تنفيذ مرتين ، الذي يعيد قيمة attribute
إلى True.
المحلول
ما لديك هو التعميم الاستيراد:باني الواردات مكون مكون الواردات منشئ.
في الوقت الواردات منشئ مكون البناء لم يكتمل بناؤها.ثم العنصر الواردات منشئ ، الذي ينفذ بقية باني وحدة (بعد import component
).في وقت لاحق, عندما المكون تحميل باني تواصل مرة أخرى مع كل شيء بعد import component
.
لاحظ أن هذا السلوك سيكون مختلفا لو كان العنصر تحميلها أولا!
في الأساس يجب أن لا تفعل دائرية الواردات.محاولة تنظيم التعليمات البرمجية في بعض طريقة أخرى.
نصائح أخرى
يجب أن تظهر حقا (إصدار مبسط من) التعليمات البرمجية الخاصة بك.شيء من هذا القبيل (على سبيل المثال، هذا project
في sys.path):
في component/__init__.py
، على سبيل المثال، يجب أن تعمل على ما يرام مع عدم وجود "التراجع" أو "إعادة تعيين".
ولكن الكود بالضبط هي يمكنك بدلا من ذلك، لأداء تلك "مهما كانت التغييرات" ...