Pyjnius: الوراثة من فئات Java لا تعمل

تم إنشاؤها على ٢٢ أغسطس ٢٠١٢  ·  7تعليقات  ·  مصدر: kivy/pyjnius

جزء من المشكلة هو أن JavaMetaClass. يفترض new أنه سيتم استدعاؤه دائمًا لإنشاء وكيل ، عندما يتم استدعاؤه لكل فئة فرعية. على نفس السطر ، يجب أن يقتصر التعامل مع jclass_registry على الوكلاء الفعليين. شيء آخر وجدته هو أن معالجة الكائنات التي يتم إرجاعها من Java متراخية ، مما يجعل من المستحيل إعادتها إلى طرق Java.

يمكنني العمل على بعض هذه القضايا في الوقت المناسب.

يعجبني كثيرًا مدى سرعة jnius في تحميل Java ، والقدرة على استخدام أحدث إصدارات Python.

تريد أن تدعم هذه القضية؟ أضف مكافأة على ذلك! نحن نقبل المنح عبر Bountysource .

enhancement

ال 7 كومينتر

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

آسف للدخول في المناقشة ، ولكن قد لا تكون وراثة فصل دراسي في Java هو ما تحتاجه @ Abalala ، أعتقد أنه من الأفضل لف فئة Java في فصل دراسي بايثون كما هو الحال في هذا الفصل . قد لا يكون واضحًا في الكود المرتبط لأن كل فئة autoclass تتم في java.py لكن الكود يعادل

class MyJavaWrapperClass(AnyPythonClassOrMixin):

    def __init__(self, *args, **kwargs):
        JavaClass = autoclass('org.uber.cool.JavaClass`)
        self._my_java_object = JavaClass(*args, **kwargs)  # use double underscore to "hide" the Java object

أسباب عدم وراثة فئة Java هي:

  • تستخدم طرق Java اصطلاحات تسمية Java وتبدو قبيحة في كود Python ، فغالبًا ما سترغب في إعادة تسمية الطرق بحيث يكون لها مظهر Python ولا تفاجئ المطورين الآخرين الذين اعتادوا استخدام pep8 (إلا إذا كنت تستخدم Zope القديم الملتوي والقديم الشفرة...)
  • بشكل عام ، يتجنب تشويش كائن python def بأساليب Java الموروثة ، وبعض طرق Java ليس لديها ما تفعله في روابط Python ، ولن يُطلق عليها سوى اسم ربما أبدًا. يؤدي التفاف فئة Java إلى جعل فئة Python أكثر نظافة في REPL وربما يتجنب المكالمات المروعة لطرق Java غير المدعومة. ضع في اعتبارك حقيقة أنه إذا لم تستخدم الشرطة السفلية المزدوجة ، فلا تزال طرق Java متاحة بسهولة.
  • أخيرًا وليس آخرًا ، هناك فرص كبيرة في أنه سيتعين عليك إضافة رمز معياري قبل أو بعد استدعاء بعض طرق Java ، فمن المرجح أن تتجاوز بعض طرق Java في Python حتى تقوم بالتحويل المناسب للنوع / الفئة أو أشياء أخرى ، لذلك ينتهي بك الأمر إلى إنشاء طريقة Python لطريقة Java تمامًا كما تفعل عند التفاف فئة Java بدلاً من وراثتها مع الاستمرار في القدرة على A) إعادة تسمية الطريقة B) والحفاظ على الدكت نظيفًا. انظر إلى طرق class Element ، class Node و class Relationship في الرسم البياني ، كلها تقريبًا تحتوي على كود معياري حتى لو كان معظم الوقت هو جعل API أكثر Pythonic ؛)

من منظور الأداء ، لا أعتقد أن هناك أي تأثير ولكن tshirtman قد يعرف بشكل أفضل.

شيء آخر ، التفاف كائنات Java يعمل بشكل جيد الآن :-)

هل يمكن تجاوز طريقة جافا باستخدام كود بايثون في الوقت الحالي؟
ماذا عن وراثة فئة جافا؟

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

@ monami7001 أي تقدم؟

كان ذلك قبل 4 سنوات تقريبًا ، وعلى حد علمي لا ، لا يزال إنشاء كود java bytecode في وقت التشغيل هو الخيار الوحيد (وربما ليس سيئًا كما كنت على الرغم من ذلك وعلينا النظر في ذلك).

أحد الحلول هو:

  1. قم بإنشاء مشروع Java منفصل بما في ذلك android.jar لإصدار android المستهدف API
  2. تنفيذ الكود (وراثة / تجاوزات ...)
  3. تصدير إلى جرة
  4. الاستيراد في buildozer

لاستخدامه مع autoclass

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات

القضايا ذات الصلة

cmacdonald picture cmacdonald  ·  20تعليقات

Thrameos picture Thrameos  ·  27تعليقات

hanslovsky picture hanslovsky  ·  3تعليقات

tshirtman picture tshirtman  ·  23تعليقات

etc0de picture etc0de  ·  5تعليقات