__Init__.py এ সংজ্ঞায়িত ক্লাস কীভাবে আমদানি করবেন


105

আমি নিজের ব্যবহারের জন্য কিছু মডিউল সাজানোর চেষ্টা করছি। আমার এরকম কিছু রয়েছে:

lib/
  __init__.py
  settings.py
  foo/
    __init__.py
    someobject.py
  bar/
    __init__.py
    somethingelse.py

ইন lib/__init__.py, আমি লাইব আমদানি করা হলে কিছু ক্লাস ব্যবহার করতে হবে তা সংজ্ঞায়িত করতে চাই। যাইহোক, ক্লাসগুলিকে ফাইলগুলিতে বিভক্ত না করে এবং এগুলি আমদানি না করে আমি এটি বের করে আনতে পারি না __init__.py

বরং বলার চেয়ে:

    lib/
      __init__.py
      settings.py
      helperclass.py
      foo/
        __init__.py
        someobject.py
      bar/
        __init__.py
        somethingelse.py

from lib.settings import Values
from lib.helperclass import Helper

আমি এরকম কিছু চাই:

    lib/
      __init__.py  #Helper defined in this file
      settings.py
      foo/
        __init__.py
        someobject.py
      bar/
        __init__.py
        somethingelse.py

from lib.settings import Values
from lib import Helper

এটা কি সম্ভব, নাকি আমার ক্লাসটি অন্য একটি ফাইলে আলাদা করতে হবে?

সম্পাদনা

ঠিক আছে, আমি যদি অন্য স্ক্রিপ্ট থেকে lib আমদানি করি তবে আমি সহায়ক শ্রেণিতে অ্যাক্সেস করতে পারি। আমি কীভাবে সেটিংস.পি থেকে সহায়ক ক্লাসটি অ্যাক্সেস করতে পারি?

উদাহরণস্বরূপ এখানে বর্ণনা ইন্ট্রা-প্যাকেজ তথ্যসূত্র। আমি উদ্ধৃতি দিয়েছিলাম "সাবমডিউলগুলি প্রায়শই একে অপরের সাথে সম্পর্কিত হওয়া প্রয়োজন"। আমার ক্ষেত্রে, lib.settings.py হেল্পারের প্রয়োজন হয় এবং lib.foo.someobject হেল্পারের অ্যাক্সেস প্রয়োজন, সুতরাং আমি হেল্পার ক্লাসটি কোথায় সংজ্ঞায়িত করব?


আপনার শেষ উদাহরণটি কাজ করা উচিত। আপনি কি একটি ইম্পোর্টেরর দেখছেন? আপনি কি বিবরণ পেস্ট করতে পারেন?
জো হোলোয়

উত্তর:


81
  1. ' lib/' এর পেরেন্ট ডাইরেক্টরি হতে হবে sys.path

  2. আপনার ' lib/__init__.py' এর মতো দেখতে লাগবে:

    from . import settings # or just 'import settings' on old Python versions
    class Helper(object):
          pass

তারপরে নিম্নলিখিত উদাহরণটিতে কাজ করা উচিত:

from lib.settings import Values
from lib import Helper

প্রশ্নের সম্পাদিত সংস্করণটির উত্তর:

__init__.pyআপনার প্যাকেজটি বাইরে থেকে কীভাবে দেখায় তা নির্ধারণ করে। আপনি ব্যবহার করতে চান, তাহলে Helperএর মধ্যে settings.pyতারপর সংজ্ঞায়িতHelper একটি আলাদা ফাইল যেমন মধ্যে, ' lib/helper.py'।

।
| `- Import_submodule.py
    `- lib
    | - __init__.py
    | - ফু
    | | - __init__.py
    | `- someobject.py
    | - helper.py
    `- settings.py

2 ডিরেক্টরি, 6 ফাইল

আদেশ:

$ python import_submodule.py

আউটপুট:

settings
helper
Helper in lib.settings
someobject
Helper in lib.foo.someobject

# ./import_submodule.py
import fnmatch, os
from lib.settings import Values
from lib import Helper

print
for root, dirs, files in os.walk('.'):
    for f in fnmatch.filter(files, '*.py'):
        print "# %s/%s" % (os.path.basename(root), f)
        print open(os.path.join(root, f)).read()
        print


# lib/helper.py
print 'helper'
class Helper(object):
    def __init__(self, module_name):
        print "Helper in", module_name


# lib/settings.py
print "settings"
import helper

class Values(object):
    pass

helper.Helper(__name__)


# lib/__init__.py
#from __future__ import absolute_import
import settings, foo.someobject, helper

Helper = helper.Helper


# foo/someobject.py
print "someobject"
from .. import helper

helper.Helper(__name__)


# foo/__init__.py
import someobject

আমি কীভাবে আমার উদাহরণে সেটিংস.পি ফাইলটিতে সহায়ক ক্লাসটি আমদানি করতে পারি?
স্কটম

আমি কেন বুঝতে পারি না যে এটি বিজ্ঞপ্তিযুক্ত। সেটিংস.পিসিকে যদি হেল্পারের প্রয়োজন হয় এবং foo.someobject.py বলতে হেল্পারের দরকার হয়, আপনি কোথায় এটির সংজ্ঞা দেওয়ার পরামর্শ দিচ্ছেন?
স্কটম

বাহ, "উদাহরণস্বরূপ" শব্দটি সত্যই উদাহরণটির অর্থ হ্রাস করতে শুরু করে। যাইহোক, আপনি আমাকে যা দেখছিলেন তা দেখিয়েছেন।
স্কটম

3
"__init__.py" এর জন্য আপভোট করা আপনার প্যাকেজটি বাইরে থেকে কীভাবে দেখায় তা নির্ধারণ করে "
পেট্রি

19

যদি সহায়তা lib/__init__.pyসহায়ক শ্রেণি সংজ্ঞায়িত হয় তবে সেটিংস.পিতে আপনি ব্যবহার করতে পারেন:

from . import Helper

এটি কাজ করে কারণ। বর্তমান ডিরেক্টরি, এবং সেটিংস মডিউলটির দৃষ্টিকোণ থেকে lib প্যাকেজের সমার্থক হিসাবে কাজ করে। মনে রাখবেন যে এর মাধ্যমে সাহায্যকারী রফতানি করার প্রয়োজন নেই__all__

(উইন্ডোজ চলমান অজগর ২.7.১০ এর সাথে নিশ্চিত হয়েছেন)


1
এটি আমার পক্ষে ভাল কাজ করছে, ডাউনভোটাররা আপনার অসন্তুষ্টি ব্যাখ্যা করুন?
yoyo

8

আপনি কেবল এগুলি __init__.py এ রেখেছেন।

টেস্ট / ক্লাস.পি থাকার সাথে:

class A(object): pass
class B(object): pass

... এবং পরীক্ষা / __ init__.py সত্ত্বা:

from classes import *

class Helper(object): pass

আপনি পরীক্ষা আমদানি করতে পারেন এবং এ, বি এবং হেল্পারের অ্যাক্সেস পেতে পারেন

>>> import test
>>> test.A
<class 'test.classes.A'>
>>> test.B
<class 'test.classes.B'>
>>> test.Helper
<class 'test.Helper'>

আপনি কোথা থেকে আমদানি করছেন?
অ্যারন মেনপা

বলুন আমি lib / settings.py থেকে সহায়তাকারী আমদানি করতে চাই?
স্কটম

1
এটি প্রায় অবশ্যই একটি বিজ্ঞপ্তি আমদানির ফলস্বরূপ হবে (সেটিংস পরীক্ষার আমদানি করবে এবং টেস্টগুলি সেটিংস আমদানি করবে) ... যা আপনার বর্ণনার সাথে সাথে নামরেয়ার তৈরি করবে। আপনি যদি প্যাকেজের অভ্যন্তরে সহায়তাপ্রাপ্তদের চান তবে আপনার কোড ব্যবহার করে এমন একটি অভ্যন্তরীণ মডিউল নির্ধারণ করতে হবে।
অ্যারন মেনপা

1
Init .py এ সহায়তাকারীরা আপনার এপিআই সহজীকরণের জন্য বাহ্যিক ব্যবহারকারীদের জন্য হওয়া উচিত।
অ্যারন মেনপা

1
যদি এটি এপিআইয়ের অংশ না হয়, তবে init .py আসলে এটির জন্য জায়গা নয়। lib / অভ্যন্তরীণ.পি বা অনুরূপ আরও ভাল হবে (যা বিজ্ঞপ্তি আমদানির সম্ভাবনা হ্রাস করার দ্বিগুণ উদ্দেশ্য)।
অ্যারন মেনপা

5

এর মতো কিছু যুক্ত করুন lib/__init__.py

from .helperclass import Helper

এখন আপনি এটি সরাসরি আমদানি করতে পারেন:

from lib import Helper


4

সম্পাদনা করুন, যেহেতু আমি প্রশ্নটি ভুল বুঝেছি:

সবে Helperক্লাস লাগিয়ে দিন __init__.py। পুরোপুরি পাইথোনিক। জাভা এর মতো ভাষা থেকে আসা দেখে এটি অদ্ভুত লাগে।


তুমি ভুল বুঝেছিলে. আমি সম্ভব হলে হেল্পার ক্লাস.পি ফাইলটি সরিয়ে দিতে চাই।
স্কটম

রিচার্ড একমাত্র তিনিই ছিলেন না যে ভুল বুঝেছিলেন। আপনার উদাহরণ কাজ করা উচিত। ট্রেসব্যাক কি?
ট্রয় জে ফারেল

ঠিক আছে, তাহলে আমি ডক্সটি সঠিকভাবে পড়েছি। সুতরাং, আমি এখন একটি পরীক্ষার কেস তৈরি করেছি এবং এটি ঠিক আছে works
স্কটম

আমার প্যাকেজটিতে আমার একই সেটআপ রয়েছে, তবে আমি একটি আমদানি ত্রুটি পেয়েছি "নাম হেল্পার আমদানি করতে পারে না"
স্কটম

আমি মনে করি আমার সমস্যাটি হ'ল আমি সেটিংস.পি থেকে সহায়ক শ্রেণি আমদানি করার চেষ্টা করছি, আমি কীভাবে এটি করতে পারি?
স্কটম

2

হ্যা এটা সম্ভব. এছাড়াও আপনি নির্ধারণ করতে চাইতে পারেন __all__মধ্যে __init__.pyফাইল। এটি মডিউলগুলির একটি তালিকা যা আপনি যখন করবেন তখন আমদানি করা হবে

from lib import *

-6

সম্ভবত এটি কাজ করতে পারে:

import __init__ as lib
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.