Hướng dẫn python class not defined same file - lớp python không được xác định cùng một tệp

Tôi rất mới với Python, tôi nghĩ rằng câu hỏi này sẽ dễ trả lời.

Vấn đề của tôi đơn giản hóa là ...

Tôi có 2 lớp trong một tệp A và lớp B. Lớp A được xác định đầu tiên trong tệp và lớp B được xác định thứ hai.

class A
    ...

class B
    ...

Làm cách nào để có quyền truy cập vào lớp B với lớp A?

class A
    something = B

class B
    somethingElse = A

Đây là mã thực tế tôi đang cố gắng sửa

class FirstResource[_ModelResource]:
    class Meta[_Meta]:
        queryset = First.objects.all[]
        resource_name = 'first'
        allowed_methods = ['get','put']

        filtering = {
            'a': ALL_WITH_RELATIONS,
            'b': ALL_WITH_RELATIONS,
            'c': ALL_WITH_RELATIONS,
        }

        ordering = ['apt']

    # this is the line that would fix everything
    second = fields.ForeignKey[SecondResource, 'second', null=True, blank=True, default=None, full=True] 

    ...

 class SecondResource[_ModelResource]:
    class Meta[_Meta]:
        queryset = Second.objects.all[]
        resource_name = 'second'
        execute_methods = ['get', 'post']
        filtering = {
            'name': ['exact'],
            'leader': ['exact'],
        }   

    super = fields.ForeignKey[FirstResource, 'super', null=True, blank=True, default=None, full=True]
    leader = fields.ForeignKey[FirstResource, 'leader', null=True, blank=True, default=None, full=True]

    ...

Không có thông báo trước trong Python Tôi thực sự không chắc chắn làm thế nào để giải quyết vấn đề này. Đầu tiên trong model.py có một người nước ngoài thứ hai và thứ hai có 2 khóa nước ngoài thứ nhất.

Di chuyển A bên dưới B không giải quyết vấn đề vì B cũng cần A. Tôi không viết mã Tôi chỉ đơn giản là cố gắng sửa nó - tôi cần khóa 'thứ hai' khi tôi thực hiện 'nhận' cho tài nguyên trong cả hai lớp.

Một thời gian có thể đến trong hành trình mã hóa của bạn khi bạn sẽ viết một mã rất phức tạp và mọi thứ sẽ ngừng có ý nghĩa. Chương trình của bạn sẽ bị rối một cách phức tạp như vậy, rằng bạn sẽ bị nhầm lẫn và sẽ ngồi nhìn chằm chằm vào màn hình về nơi để tiến về phía trước từ đây. & NBSP; Những gì các lập trình viên có kinh nghiệm làm trong tình huống như vậy là họ chia toàn bộ chương trình thành các khối hoặc mô -đun và sau đó đưa chúng vào các tệp khác nhau. Khi làm như vậy, họ giảm độ phức tạp của chương trình, giúp họ dễ dàng gỡ lỗi và xác định lỗi. Để sử dụng một lớp hoặc phương thức, được lưu trữ trong một tệp Python khác, chúng tôi cần nhập lớp vào tệp làm việc của mình. & NBSP;

Trong bài viết này, chúng tôi sẽ làm cho bạn quen thuộc với quá trình nhập một lớp từ một tệp khác trong Python. Nhưng trước khi lặn thẳng vào các lớp nhập khẩu, chúng ta hãy xóa một số điều cơ bản.importing a class from another file in python. But before diving straight into importing classes, let us clear some basics.

Một lớp học trong Python là gì?

Một lớp là một bản thiết kế hoặc nguyên mẫu được người dùng xác định và được sử dụng để xây dựng mọi thứ. Các lớp cho phép bạn nhóm dữ liệu và chức năng cùng nhau. Một lớp mới giới thiệu một loại đối tượng mới, cho phép tạo ra các trường hợp mới thuộc loại đó. Mỗi phiên bản của một lớp có thể có các thuộc tính được liên kết với nó để theo dõi trạng thái của nó. Các phiên bản lớp cũng có thể có các phương thức thay đổi trạng thái của chúng [được chỉ định bởi lớp của họ].

Hãy xem xét tình huống sau: Chúng tôi muốn theo dõi khách hàng trong một khách sạn. Vì vậy, mỗi khách hàng sẽ có một số thuộc tính chung như tên, tuổi, ngày sinh, ngày nhận phòng, ngày thanh toán, v.v. Nhưng các giá trị của các thuộc tính này sẽ khác nhau cho mỗi khách hàng. Do đó, chúng tôi tạo ra một kế hoạch chi tiết cho khách hàng ở trong khách sạn của chúng tôi và sau đó tạo các trường hợp của lớp khách hàng, cho phép chúng tôi lưu trữ các giá trị tài sản cụ thể cho mỗi khách hàng. & NBSP;

Ngoài ra, tìm hiểu làm thế nào để có được một tên lớp trong Python.

Một lớp tạo cấu trúc dữ liệu do người dùng xác định với các thành viên dữ liệu và phương thức thành viên của riêng mình có thể được truy cập và sử dụng bằng cách thiết lập một thể hiện lớp. Một lớp tương tự như bản thiết kế của một đối tượng.

Tại sao chúng ta cần nhập một lớp từ một tệp khác trong Python?

Bây giờ, đây là một câu hỏi rất hay. Như đã thảo luận ở trên khi viết các chương trình dài, mã có xu hướng trở nên phức tạp và khó hiểu. Do đó để tăng khả năng đọc và khả năng hiểu của mã, các lập trình viên thường tuân theo cách tiếp cận mô -đun.

Lập trình mô -đun là một mô hình lập trình trong đó thay vì phát triển mã cho một vấn đề lớn duy nhất, chúng tôi chia nó thành nhiều vấn đề nhỏ hơn. Chúng tôi sẽ kết hợp tất cả chúng lại với nhau một khi chúng tôi đã giải quyết tất cả để đạt được mục tiêu chính của chúng tôi.

Theo cách tiếp cận mô -đun làm tăng khả năng tái sử dụng của mã. Điều này có nghĩa là một tập hợp các câu lệnh được lặp lại nhiều lần bên trong mã có thể được đặt bên trong một hàm và hàm đó có thể được gọi bất cứ khi nào các bộ câu lệnh đó cần được thực thi. Cách tiếp cận này làm cho chúng tôi đơn giản để quản lý chúng và thực hiện sửa đổi dựa trên nhu cầu của chúng tôi. Hơn nữa, nó thực sự hỗ trợ chúng tôi trong việc gỡ lỗi chương trình của chúng tôi vì chúng tôi không phải gây rối với nhiều tệp.

Do đó, để thực hiện một cách tiếp cận mô -đun, chúng tôi yêu cầu báo cáo nhập.

Làm thế nào để nhập lớp từ một tệp khác trong Python?

Nếu bạn quen thuộc với ngôn ngữ lập trình C ++ thì bạn phải nhận thấy #include trong C ++, dòng #include thực hiện cùng một câu lệnh nhập đạt được trong Python. Nó cho phép chúng tôi sử dụng các chức năng và các lớp được giữ trong một số tệp khác bên trong mã hiện tại của chúng tôi.

Python cung cấp cho chúng tôi nhiều cách khác nhau để chúng tôi có thể nhập các lớp và chức năng bằng cách sử dụng các câu lệnh nhập.

Báo cáo nhập khẩu

Bây giờ một mô tả nhỏ về tuyên bố nhập khẩu. Câu lệnh nhập cho phép chúng tôi nhập mã từ các tệp hoặc mô -đun khác vào tệp hiện tại. Bạn có thể coi đó là một liên kết cho phép chúng tôi truy cập các thuộc tính hoặc phương thức lớp từ các tệp khác và sử dụng chúng.

Cú pháp của các báo cáo nhập như sau:

trong đó mô -đun là mô -đun mà bạn muốn nhập.

Để nhập lớp, cú pháp là:

from fileName import className

Đây là tên tệp là tên của tệp mà chúng tôi muốn nhập một lớp và tên lớp là tên của lớp được nhập

Nhập các lớp từ một tệp khác trong cùng một thư mục

Hãy tưởng tượng chúng ta phải tuân theo cấu trúc thư mục:

Main
  |-- animal_def.py
  |-- file.py

Tệp Animal_def.py chứa một lớp như hình dưới đây:

class Animal:

    def print_animal[self]:
        return 'This is animal class'

Bây giờ để sử dụng lớp này bên trong tệp tệp.py, chúng ta cần sử dụng cú pháp thứ hai được đề cập ở trên, trong trường hợp này sẽ trở thành:

From animal_def import Animal

Bây giờ lớp được bao gồm trong tệp Tệp.py. Hãy tưởng tượng mã của lớp động vật được sao chép vào tệp.py. Bây giờ chúng ta có thể sử dụng nó như một lớp bình thường bên trong tệp file.py. Vì vậy, mã bên trong tệp.py sẽ trông giống như thế này:

#file.py
# import Animal class
from animal_def import Animal

# create object of class
animal = Animal[]

# call class method
print[animal.print_animal[]]

Output:

Vì ở đây, chúng tôi đang nhập từ một tệp có trong cùng một thư mục, do đó, chúng tôi cũng có thể nhập động vật lớp bằng cách sử dụng câu lệnh sau.

Mã bên trong tệp file.py sẽ trở thành

#file.py
# import Animal class
import animal_def

# create object of class
animal = animal_def.Animal[]

# call class method
print[animal.print_animal[]]

Output:

Lưu ý làm thế nào ở đây, đường dẫn đầy đủ đến lớp cần được cung cấp để truy cập nó.

Lưu ý: Bạn có thể nhập nhiều hơn một lớp từ cùng một tệp trong Python bằng cách tách tên lớp bằng dấu phẩy. Ví dụ,

From FileName import class1, class2, class3, ………

Nhập tất cả các lớp từ một tệp khác trong cùng một thư mục

Ở đây chúng tôi sẽ sử dụng cùng một cấu trúc thư mục, được sử dụng trong trường hợp trước. Nhưng mã trong tệp Animal_def.py được cập nhật để chứa mã sau:

class A
    something = B

class B
    somethingElse = A
0

Để nhập tất cả các lớp từ một tệp bên trong một tệp khác, cú pháp là

* Chỉ ra tất cả các lớp. Vì vậy, để sử dụng cả hai lớp bên trong tệp Animal_def.py bên trong tệp File.py mà chúng ta có thể viết:

Bây giờ, chúng ta có thể sử dụng cả hai lớp bên trong tệp tệp.py như thể chúng được viết bên trong nó.

Ví dụ:

class A
    something = B

class B
    somethingElse = A
1

Output:

class A
    something = B

class B
    somethingElse = A
2

Việc sử dụng dấu * có vẻ không có ý nghĩa lắm vào thời điểm này & nbsp; vì tệp Animal_def.py chỉ chứa hai định nghĩa lớp. Hãy tưởng tượng những gì một nhiệm vụ tẻ nhạt nó có thể đã trở thành để nhập tất cả các lớp theo tên nếu tệp có chứa hàng chục định nghĩa lớp. Đó là khi dấu * có ích. & nbsp;

Nhập các lớp từ một thư mục khác

Nhiều lần nó xảy ra rằng tệp chúng tôi muốn nhập từ không có trong thư mục làm việc hiện tại của chúng tôi. Giả sử rằng cấu trúc thư mục như sau:

class A
    something = B

class B
    somethingElse = A
3

Bây giờ, để có thể sử dụng các lớp tệp Animal_def.py bên trong tệp File1.py, trước tiên chúng ta cần thêm một tệp có tên __init__.py bên trong thư mục mô -đun. Tệp này thông báo cho trình thông dịch Python rằng thư mục mô -đun là một gói chứa các tệp có định nghĩa lớp. Tệp này có thể bị bỏ trống.

Cấu trúc thư mục được cập nhật trở thành:

class A
    something = B

class B
    somethingElse = A
4

Trong trường hợp này, cú pháp nhập lớp khác từ một thư mục khác trở thành

class A
    something = B

class B
    somethingElse = A
5

Vì vậy, trong trường hợp của chúng tôi, câu lệnh nhập sẽ như sau:

class A
    something = B

class B
    somethingElse = A
6

Bây giờ, chúng ta có thể sử dụng lớp động vật bên trong tệp File1.py. Nhìn vào mã mẫu cho tệp File1.py bên dưới:

class A
    something = B

class B
    somethingElse = A
7

Output:

class A
    something = B

class B
    somethingElse = A
2

Chúng ta hãy lấy một ví dụ khác, giả sử cấu trúc thư mục như sau:

class A
    something = B

class B
    somethingElse = A
9

Trong trường hợp này, để có thể sử dụng lớp động vật bên trong tệp File1.py, chúng ta cần sử dụng đường dẫn hoàn chỉnh cho tệp với tên của các thư mục được phân tách bởi toán tử DOT. Vì vậy, câu lệnh nhập, trong trường hợp này, sẽ trông như sau:

class FirstResource[_ModelResource]:
    class Meta[_Meta]:
        queryset = First.objects.all[]
        resource_name = 'first'
        allowed_methods = ['get','put']

        filtering = {
            'a': ALL_WITH_RELATIONS,
            'b': ALL_WITH_RELATIONS,
            'c': ALL_WITH_RELATIONS,
        }

        ordering = ['apt']

    # this is the line that would fix everything
    second = fields.ForeignKey[SecondResource, 'second', null=True, blank=True, default=None, full=True] 

    ...

 class SecondResource[_ModelResource]:
    class Meta[_Meta]:
        queryset = Second.objects.all[]
        resource_name = 'second'
        execute_methods = ['get', 'post']
        filtering = {
            'name': ['exact'],
            'leader': ['exact'],
        }   

    super = fields.ForeignKey[FirstResource, 'super', null=True, blank=True, default=None, full=True]
    leader = fields.ForeignKey[FirstResource, 'leader', null=True, blank=True, default=None, full=True]

    ...
0

Một điểm quan trọng khác ở đây là tệp __init__.py không cần phải được đưa vào cả hai thư mục, nó chỉ cần có trong thư mục chính.

Nhập các lớp từ một thư mục khác bằng mô -đun SYS

Hãy tưởng tượng cấu trúc thư mục như sau:

class FirstResource[_ModelResource]:
    class Meta[_Meta]:
        queryset = First.objects.all[]
        resource_name = 'first'
        allowed_methods = ['get','put']

        filtering = {
            'a': ALL_WITH_RELATIONS,
            'b': ALL_WITH_RELATIONS,
            'c': ALL_WITH_RELATIONS,
        }

        ordering = ['apt']

    # this is the line that would fix everything
    second = fields.ForeignKey[SecondResource, 'second', null=True, blank=True, default=None, full=True] 

    ...

 class SecondResource[_ModelResource]:
    class Meta[_Meta]:
        queryset = Second.objects.all[]
        resource_name = 'second'
        execute_methods = ['get', 'post']
        filtering = {
            'name': ['exact'],
            'leader': ['exact'],
        }   

    super = fields.ForeignKey[FirstResource, 'super', null=True, blank=True, default=None, full=True]
    leader = fields.ForeignKey[FirstResource, 'leader', null=True, blank=True, default=None, full=True]

    ...
1

Trong trường hợp này, chúng tôi sẽ cần sử dụng một thư viện được xác định trước có tên là SYS. Sau đó, chúng tôi sử dụng mô -đun sys.path.insert [] để nói với trình thông dịch Python về nơi tìm mô -đun. Vì vậy, chúng tôi cần nói với trình thông dịch xem thư mục trên thư mục hiện tại, do đó, chúng tôi sử dụng ‘..sys. Then we use the sys.path.insert[] module to tell the Python interpreter to where to look for the module. So we need to tell the interpreter to look at the directory above the current directory, therefore, we use ‘..’

Ví dụ:

class FirstResource[_ModelResource]:
    class Meta[_Meta]:
        queryset = First.objects.all[]
        resource_name = 'first'
        allowed_methods = ['get','put']

        filtering = {
            'a': ALL_WITH_RELATIONS,
            'b': ALL_WITH_RELATIONS,
            'c': ALL_WITH_RELATIONS,
        }

        ordering = ['apt']

    # this is the line that would fix everything
    second = fields.ForeignKey[SecondResource, 'second', null=True, blank=True, default=None, full=True] 

    ...

 class SecondResource[_ModelResource]:
    class Meta[_Meta]:
        queryset = Second.objects.all[]
        resource_name = 'second'
        execute_methods = ['get', 'post']
        filtering = {
            'name': ['exact'],
            'leader': ['exact'],
        }   

    super = fields.ForeignKey[FirstResource, 'super', null=True, blank=True, default=None, full=True]
    leader = fields.ForeignKey[FirstResource, 'leader', null=True, blank=True, default=None, full=True]

    ...
2

Output:

class A
    something = B

class B
    somethingElse = A
2

Việc sử dụng dấu * có vẻ không có ý nghĩa lắm vào thời điểm này & nbsp; vì tệp Animal_def.py chỉ chứa hai định nghĩa lớp. Hãy tưởng tượng những gì một nhiệm vụ tẻ nhạt nó có thể đã trở thành để nhập tất cả các lớp theo tên nếu tệp có chứa hàng chục định nghĩa lớp. Đó là khi dấu * có ích. & nbsp;

Nhập các lớp từ một thư mục kháconline python tutors who are available 24/7.

Mỗi lớp có nên ở trong một tệp python khác nhau không?

Không cần .. trừ khi bạn thực sự đang viết các lớp với rất nhiều phương pháp và muốn tạo các mô -đun ra khỏi từng lớp đó. Với các tệp riêng biệt cho các lớp nhỏ hơn, bạn chỉ cần tăng số lượng "nhập", bạn sẽ kết thúc việc viết trong mô -đun/tệp người gọi của mình... unless you really are writing classes with a lot of methods and would like to create modules out of each one of those classes. With separate files for smaller classes, you just increase the amount of "import" you will end up writing in your caller module/file.

Các lớp khác nhau có nên nằm trong các tệp khác nhau không?

Nếu bạn có một lớp thực sự cần phải là một lớp riêng biệt nhưng cũng chỉ được sử dụng ở một nơi, có lẽ tốt nhất là giữ nó trong cùng một tệp.Tuy nhiên, nếu điều này xảy ra thường xuyên, bạn có thể gặp vấn đề lớn hơn trên tay.it's probably best to keep it in the same file. If this is happening frequently, though, you might have a bigger problem on your hands.

Làm thế nào để bạn gọi một hàm trong cùng một tệp python?

Khi một hàm được tạo trong Python, chúng ta có thể gọi nó bằng cách viết function_name [] chính hoặc hàm khác/ hàm lồng nhau.Sau đây là cú pháp để gọi một hàm.Cú pháp: DEF function_name []:by writing function_name[] itself or another function/ nested function. Following is the syntax for calling a function. Syntax: def function_name[]:

Chúng ta có thể nhập lớp trong Python không?

Nó cho phép chúng tôi sử dụng các chức năng và các lớp được giữ trong một số tệp khác bên trong mã hiện tại của chúng tôi.Python cung cấp cho chúng tôi nhiều cách khác nhau để chúng tôi có thể nhập các lớp và chức năng bằng cách sử dụng các câu lệnh nhập.Python provides us with various ways in which we can import classes and functions using the import statements.

Chủ Đề