Pyjnius: Java ν΄λž˜μŠ€μ—μ„œ 상속이 μž‘λ™ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

에 λ§Œλ“  2012λ…„ 08μ›” 22일  Β·  7μ½”λ©˜νŠΈ  Β·  좜처: kivy/pyjnius

문제의 μΌλΆ€λŠ” JavaMetaClassμž…λ‹ˆλ‹€. new λŠ” λͺ¨λ“  μžμ† ν΄λž˜μŠ€μ— λŒ€ν•΄ 호좜될 λ•Œ ν”„λ‘μ‹œλ₯Ό μƒμ„±ν•˜κΈ° μœ„ν•΄ 항상 ν˜ΈμΆœλœλ‹€κ³  κ°€μ •ν•©λ‹ˆλ‹€. 같은 μ€„μ—μ„œ jclass_registry의 μ²˜λ¦¬λŠ” μ‹€μ œ ν”„λ‘μ‹œλ‘œ μ œν•œλ˜μ–΄μ•Ό ν•©λ‹ˆλ‹€. λ‚΄κ°€ 찾은 또 λ‹€λ₯Έ 점은 Javaμ—μ„œ λ°˜ν™˜λœ 개체의 μ²˜λ¦¬κ°€ λŠμŠ¨ν•˜μ—¬ Java λ©”μ„œλ“œλ‘œ λ‹€μ‹œ μ „λ‹¬ν•˜λŠ” 것이 λΆˆκ°€λŠ₯ν•˜λ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€.

λ‚˜λŠ” 이 λ¬Έμ œλ“€ 쀑 일뢀λ₯Ό μ μ‹œμ— μ²˜λ¦¬ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

jniusκ°€ Javaλ₯Ό λ‘œλ“œν•˜λŠ” 속도와 μ΅œμ‹  λ²„μ „μ˜ Python을 μ‚¬μš©ν•  수 μžˆλŠ” 속도가 맀우 λ§ˆμŒμ— λ“­λ‹ˆλ‹€.

이 문제λ₯Ό λ’·λ°›μΉ¨ν•˜κ³  μ‹ΆμœΌμ‹ κ°€μš”? ν˜„μƒκΈˆμ„ κ²Œμ‹œν•˜μ‹­μ‹œμ˜€! μš°λ¦¬λŠ” Bountysource λ₯Ό 톡해 ν˜„μƒκΈˆμ„ λ°›μŠ΅λ‹ˆλ‹€.

enhancement

λͺ¨λ“  7 λŒ“κΈ€

μ§€μ—°λ˜μ–΄ μ£„μ†‘ν•©λ‹ˆλ‹€. 각 λ¬Έμ œμ— λŒ€ν•΄ 더 ꡬ체적인(ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€?) μ„€λͺ…을 μ œκ³΅ν•  수 μžˆμŠ΅λ‹ˆκΉŒ? λ‚˜λŠ” νŒŒμ΄μ¬μ—μ„œ μžλ°” 클래슀의 상속을 ν—ˆμš©ν•˜κΈ° μœ„ν•΄ λͺ‡ 가지 μž‘μ—…μ„ μ‹œμž‘ν–ˆμ§€λ§Œ(ν”„λ‘μ‹œ μ‚¬μš©) 아직 μ™„λ£Œλ˜μ§€ μ•Šμ•˜μŠ΅λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ μ—¬κΈ°μ—μ„œ μ§€μ ν•œ λ¬Έμ œλŠ” 그와 λŠμŠ¨ν•˜κ²Œ κ΄€λ ¨λ˜μ–΄ μžˆλŠ” 것 κ°™μœΌλ©° μ—¬λŸ¬ λ‹€λ₯Έ 문제둜 λΆ„ν• λ˜μ–΄μ•Ό ν•©λ‹ˆλ‹€.

토둠에 λ‚˜μ„œμ„œ λ―Έμ•ˆν•˜μ§€λ§Œ Java 클래슀λ₯Ό μƒμ†ν•˜λŠ” 것은 @Apalala κ°€ ν•„μš”ν•œ 것이 아닐 μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€. 이 클래슀 μ—μ„œ μˆ˜ν–‰λœ κ²ƒμ²˜λŸΌ Java 클래슀λ₯Ό Python 클래슀둜 λž˜ν•‘ν•˜λŠ” 것이 더 λ‚˜μ€ 아이디어라고 μƒκ°ν•©λ‹ˆλ‹€. λͺ¨λ“  μžλ™ ν΄λž˜μŠ€κ°€ 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λ₯Ό μˆ˜ν–‰ν•˜λŠ” 경우 μ œμ™Έ μ•”ν˜Έ...)
  • 일반적으둜 Java 상속 λ©”μ†Œλ“œλ‘œ python 객체 사전 을 μ–΄μ§€λŸ½νžˆλŠ” 것을 λ°©μ§€ν•˜κ³  일뢀 Java λ©”μ†Œλ“œλŠ” Python λ°”μΈλ”©μ—μ„œ 아무 관련이 μ—†μœΌλ©° 거의 β€‹β€‹ν˜ΈμΆœλ˜μ§€ μ•Šμ„ κ²ƒμž…λ‹ˆλ‹€. Java 클래슀λ₯Ό λž˜ν•‘ν•˜λ©΄ REPLμ—μ„œ Python ν΄λž˜μŠ€κ°€ 더 깔끔해지고 μ§€μ›λ˜μ§€ μ•ŠλŠ” Java λ©”μ†Œλ“œμ— λŒ€ν•œ λ‘λ €μš΄ ν˜ΈμΆœμ„ ν”Όν•  수 μžˆμŠ΅λ‹ˆλ‹€. 이쀑 밑쀄을 μ‚¬μš©ν•˜μ§€ μ•ŠμœΌλ©΄ Java λ©”μ†Œλ“œλ₯Ό μ—¬μ „νžˆ μ‰½κ²Œ μ‚¬μš©ν•  수 μžˆλ‹€λŠ” 사싀을 염두에 λ‘μ‹­μ‹œμ˜€.
  • λ§ˆμ§€λ§‰μœΌλ‘œ μ€‘μš”ν•œ 것은 일뢀 Java λ©”μ†Œλ“œ 호좜 전후에 μƒμš©κ΅¬ μ½”λ“œλ₯Ό μΆ”κ°€ν•΄μ•Ό ν•  κ°€λŠ₯성이 λ†’λ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€. μ μ ˆν•œ μœ ν˜•/클래슀 λ³€ν™˜ λ˜λŠ” 기타 μž‘μ—…μ„ μˆ˜ν–‰ν•˜κΈ° μœ„ν•΄ Pythonμ—μ„œ 일뢀 Java λ©”μ†Œλ“œλ₯Ό μž¬μ •μ˜ν•  κ°€λŠ₯성이 ν½λ‹ˆλ‹€. , λ”°λΌμ„œ A) λ©”μ„œλ“œ 이름을 λ³€κ²½ν•  수 μžˆλŠ” λ™μ•ˆ Java 클래슀λ₯Ό λž˜ν•‘ν•  λ•Œμ™€ λ§ˆμ°¬κ°€μ§€λ‘œ Java λ©”μ„œλ“œμ— λŒ€ν•œ Python λ©”μ„œλ“œλ₯Ό μƒμ„±ν•˜κ²Œ λ©λ‹ˆλ‹€. B) 사전 을 κΉ¨λ—ν•˜κ²Œ μœ μ§€ν•©λ‹ˆλ‹€. κ·Έλž˜ν”„ μ—μ„œ class Element , class Node 및 class Relationship 의 λ©”μ†Œλ“œλ₯Ό λ³΄μ‹­μ‹œμ˜€. λŒ€λΆ€λΆ„μ˜ 경우 APIλ₯Ό 더 Pythonicν•˜κ²Œ λ§Œλ“œλŠ” κ²ƒμ΄μ§€λ§Œ 거의 λͺ¨λ‘ μƒμš©κ΅¬ μ½”λ“œλ₯Ό 가지고 μžˆμŠ΅λ‹ˆλ‹€. ;)

μ„±λŠ₯ λ©΄μ—μ„œλŠ” 영ν–₯이 μ—†λ‹€κ³  μƒκ°ν•˜μ§€λ§Œ @tshirtman 이 더 잘 μ•Œ 수 μžˆμŠ΅λ‹ˆλ‹€.

또 λ‹€λ₯Έ 점은 Java 객체λ₯Ό λž˜ν•‘ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€.

μ§€κΈˆμ€ Python μ½”λ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ Java λ©”μ„œλ“œλ₯Ό μž¬μ •μ˜ν•  수 μžˆμŠ΅λ‹ˆκΉŒ?
μžλ°” 클래슀 상속은 μ–΄λ–»μŠ΅λ‹ˆκΉŒ?

λ‚˜λŠ” 이것을 μ°ΎλŠ” 데 κ½€ λ§Žμ€ μ‹œκ°„μ„ λ³΄λƒˆκ³  λŸ°νƒ€μž„μ— Java λ°”μ΄νŠΈ μ½”λ“œλ₯Ό μƒμ„±ν•˜λŠ” 것 μ™Έμ—λŠ” μ‹€μš©μ μΈ 방법이 μ—†λ‹€λŠ” 결둠에 이λ₯΄λ €μŠ΅λ‹ˆλ‹€. λΌμ΄λΈŒλŸ¬λ¦¬μ— λŒ€ν•œ λ§Žμ€ λ³΅μž‘μ„±κ³Ό μ•„λ§ˆλ„ λ²”μœ„λ₯Ό λ²—μ–΄λ‚©λ‹ˆλ‹€. 닫을지 ν™•μ‹€ν•˜μ§€ μ•Šμ§€λ§Œ μž‘μ—…μ΄ μ™„λ£Œλ˜μ§€ μ•Šμ„ κ²ƒμ΄λ―€λ‘œ wontfix둜 ν‘œμ‹œν•˜λŠ” 것이 λΆ€λ‹Ήν•˜μ§€ μ•Šμ„ κ²ƒμž…λ‹ˆλ‹€.

@monami7001 진행상황?

그것은 ~4λ…„ μ „μ΄μ—ˆκ³ , λ‚΄ μ§€μ‹μœΌλ‘œλŠ” λŸ°νƒ€μž„μ— Java λ°”μ΄νŠΈ μ½”λ“œλ₯Ό μƒμ„±ν•˜λŠ” 것이 μ—¬μ „νžˆ μœ μΌν•œ μ˜΅μ…˜μΈ κ²ƒμ²˜λŸΌ λ³΄μž…λ‹ˆλ‹€(그리고 μ•„λ§ˆλ„ λ‚˜λ§ŒνΌ λ‚˜μ˜μ§€λŠ” μ•ŠμœΌλ©° μš°λ¦¬λŠ” 그것을 쑰사해야 ν•©λ‹ˆλ‹€).

ν•œ 가지 ν•΄κ²° 방법 은 λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

  1. λŒ€μƒ Android 버전 API의 android.jar을 ν¬ν•¨ν•˜λŠ” λ³„λ„μ˜ Java ν”„λ‘œμ νŠΈ 생성
  2. μ½”λ“œ κ΅¬ν˜„(상속/μž¬μ •μ˜...)
  3. ν•­μ•„λ¦¬λ‘œ 내보내기
  4. λΉŒλ”μ—μ„œ κ°€μ Έμ˜€κΈ°

autoclass와 ν•¨κ»˜ μ‚¬μš©ν•˜λ €λ©΄

이 νŽ˜μ΄μ§€κ°€ 도움이 λ˜μ—ˆλ‚˜μš”?
0 / 5 - 0 λ“±κΈ‰