سمات الطبقة إعادة تعيين عند استيرادها من حزمة

StackOverflow https://stackoverflow.com/questions/3216908

  •  13-09-2020
  •  | 
  •  

سؤال

لدي مشروع تنظيم شيئا مثل

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):

giveacodicetagpre.

في component/__init__.py، على سبيل المثال، يجب أن تعمل على ما يرام مع عدم وجود "التراجع" أو "إعادة تعيين".

ولكن الكود بالضبط هي يمكنك بدلا من ذلك، لأداء تلك "مهما كانت التغييرات" ...

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top