سؤال

يبدو أن استخدام GET/SET هو ممارسة شائعة في Java (لأسباب مختلفة) ، لكنني بالكاد أرى رمز Python الذي يستخدم هذا.

لماذا تستخدم أو تجنب الحصول على/تعيين طرق في بيثون؟

هل كانت مفيدة؟

المحلول

رابط رائع: بيثون ليس جافا :)

في Java ، يجب عليك استخدام Getters و Petters لأن استخدام الحقول العامة لا يمنحك أي فرصة للعودة وتغيير عقلك لاحقًا إلى استخدام Getters و Petters. لذلك في Java ، يمكنك أيضًا الخروج من العمل في المقدمة. في بيثون ، هذا سخيف ، لأنه يمكنك البدء بسمات طبيعية وتغيير رأيك في أي وقت ، دون التأثير على أي عملاء في الفصل. لذلك ، لا تكتب getters والمستقبين.

نصائح أخرى

في Python ، يمكنك فقط الوصول إلى السمة مباشرة لأنها عامة:

class MyClass:

    def __init__(self):
        self.my_attribute = 0  

my_object = MyClass()
my_object.my_attribute = 1 # etc.

إذا كنت ترغب في القيام بشيء ما حول الوصول أو طفرة السمة ، فيمكنك الاستخدام ملكيات:

class MyClass:

    def __init__(self):
        self._my_attribute = 0

    @property
    def my_attribute(self):
        # Do something if you want
        return self._my_attribute

    @my_attribute.setter
    def my_attribute(self, value):
        # Do something if you want
        self._my_attribute = value

بشكل حاسم ، يبقى رمز العميل كما هو.

إليك ما يقوله Guido Van Rossum عن ذلك في العقل المدبر للبرمجة

ماذا تقصد بـ "محاربة اللغة"؟

Guido: هذا يعني عادة أنهم يحاولون مواصلة عاداتهم التي عملت بشكل جيد مع لغة مختلفة.

...] سيقوم الناس بتحويل كل شيء إلى فصل ، ويحولون كل وصول إلى طريقة ملحق ،
حيث هذا ليس شيئًا حكيمًا في بيثون ؛ سيكون لديك المزيد من الكود المطوّل
من الصعب تصحيحها وتشغيل أبطأ بكثير. أنت تعرف تعبير "يمكنك كتابة فورتران بأي لغة؟" يمكنك كتابة جافا بأي لغة أيضًا.

لا ، إنه غير صاخب. الطريقة المقبولة عمومًا هي استخدام سمة البيانات العادية واستبدال تلك التي تحتاج إلى منطق GET/SET أكثر تعقيدًا مع الخصائص.

الإجابة المختصرة على سؤالك هي لا ، يجب عليك استخدام الخصائص عند الحاجة. يوفر Ryan Tamyoko الإجابة الطويلة في مقالته getters/setters/fuxors

القيمة الأساسية التي يجب التخلص منها من كل هذا هي أنك تريد السعي للتأكد من أن كل سطر من الكود لديه بعض القيمة أو المعنى للمبرمج. لغات البرمجة هي للبشر ، وليس الآلات. إذا كان لديك رمز يبدو أنه لا يفعل أي شيء مفيد ، فمن الصعب قراءته ، أو يبدو مملاً ، فمن الجيد أن يكون لدى Python بعض ميزات اللغة التي تتيح لك إزالتها.

ملاحظتك صحيحة. هذا ليس أسلوبًا طبيعيًا لبرمجة Python. السمات كلها عامة ، لذا يمكنك الوصول إلى فقط (الحصول عليها ، تعيين ، حذفها) كما تفعل مع سمات أي كائن لديه (وليس فقط الفصول أو الحالات). من السهل معرفة متى يتعلم مبرمبو Java Python لأن رمز Python الخاص بهم يشبه Java باستخدام بناء جملة Python!

أنا بالتأكيد أتفق مع جميع الملصقات السابقة ، وخاصة رابط @Maximiliano لمقال فيليب الشهير و اقتراح @Max أن أي شيء أكثر تعقيدًا من الطريقة القياسية لإعداد السمات (والحصول) على سمات الفئة والمثيرة هو استخدام الخصائص (أو الواصفات لتعميم المزيد) لتخصيص الحصول على السمات! (يتضمن ذلك القدرة على إضافة إصدارات مخصصة خاصة بك من السياسة الخاصة أو المحمية أو الصديق أو أي سياسة تريدها إذا كنت ترغب في شيء آخر غير العام.)

كتوضيح مثير للاهتمام ، في برمجة بيثون الأساسية (الفصل 13 ، القسم 13.16) ، توصلت إلى مثال على استخدام الواصفات لتخزين السمات على القرص بدلاً من الذاكرة !! نعم ، إنه شكل غريب من أشكال التخزين المستمر ، لكنه يفعل أظهر لك مثالًا على ما هو ممكن!

إليك وظيفة أخرى ذات صلة قد تجدها مفيدة أيضًا:Python: خصائص متعددة ، Setter/getter واحدة

لقد جئت إلى هنا لهذه الإجابة (لسوء الحظ لم أستطع). لكنني وجدت أ العمل حولها في مكان آخر . يمكن أن يكون هذا الرمز أدناه بديلاً عن احصل على .
class get_var_lis: def __init__(self): pass def __call__(self): return [2,3,4] def __iter__(self): return iter([2,3,4]) some_other_var = get_var_lis
هذا مجرد أ الحل البديل . باستخدام المفهوم أعلاه ، يمكنك بسهولة إنشاء منهجية GET/SET في PY أيضًا.

أظهر معلمنا مثالًا واحدًا على الفصل يشرح متى يجب أن نستخدم وظائف الإكسسوارات.

class Woman(Human):
    def getAge(self):
        if self.age > 30:
            return super().getAge() - 10
        else:
            return super().getAge()
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top