Hướng dẫn how to define variables outside of a class in python? - làm thế nào để xác định các biến bên ngoài một lớp trong python?

Trình chỉnh sửa văn bản của tôi có thể mở rộng thông qua các plugin Python. Nó yêu cầu tôi mở rộng các lớp và ghi đè các phương thức của nó. Cấu trúc chung trông tương tự đoạn trích dưới đây. Lưu ý rằng chữ ký chức năng được cố định.

global ftp_client # does it reference the variable of the outer scope?
self.ftp_client = ftplib.FTP['foo']
0 được cho là được chia sẻ bởi các trường hợp của cả hai lớp.

ftp_client = None

class FtpFileCommand[sublime_plugin.TextCommand]:
  def run[self, args]:
    global ftp_client # does it reference the variable of the outer scope?
    self.ftp_client = ftplib.FTP['foo']
    # login and stuff

class FtpFileEventListener[sublime_plugin.EventListener]:
  def run[self, args]:
    global ftp_client # same for this
    self.ftp_client.quit[] # 

Cả hai lớp này được cho là có một biến chung. Thực tiễn tốt nhất để chia sẻ các biến là gì?

Chỉnh sửa dựa trên câu trả lời của Madjars: based on madjars answer:

global ftp_client # does it reference the variable of the outer scope?
self.ftp_client = ftplib.FTP['foo']
1 được gọi là đầu tiên, Instanciates
global ftp_client # does it reference the variable of the outer scope?
self.ftp_client = ftplib.FTP['foo']
0 và hoạt động như một sự quyến rũ.
global ftp_client # does it reference the variable of the outer scope?
self.ftp_client = ftplib.FTP['foo']
3 được gọi là sau và, có thể tham khảo
global ftp_client # does it reference the variable of the outer scope?
self.ftp_client = ftplib.FTP['foo']
0 một cách hoàn hảo nhưng nó vẫn là
global ftp_client # does it reference the variable of the outer scope?
self.ftp_client = ftplib.FTP['foo']
5. Sử dụng từ khóa toàn cầu, nó có thêm biến làm thành viên vào
global ftp_client # does it reference the variable of the outer scope?
self.ftp_client = ftplib.FTP['foo']
6 không?

Hỏi ngày 13 tháng 10 năm 2011 lúc 13:10Oct 13, 2011 at 13:10

fjdumontfjdumontfjdumont

1.5071 huy hiệu vàng9 Huy hiệu bạc22 Huy hiệu đồng1 gold badge9 silver badges22 bronze badges

1

Đúng, đó chính xác là cách

global ftp_client # does it reference the variable of the outer scope?
self.ftp_client = ftplib.FTP['foo']
7 hoạt động.

Dường như với tôi, bạn đang làm đúng, vì nó đã được thực hiện theo cách này trong một số mô -đun của thư viện tiêu chuẩn Python [ví dụ, FileInput].

Đã trả lời ngày 13 tháng 10 năm 2011 lúc 13:23Oct 13, 2011 at 13:23

Madjarmadjarmadjar

12.3k2 Huy hiệu vàng44 Huy hiệu bạc52 Huy hiệu đồng2 gold badges44 silver badges52 bronze badges

3

Trong mã này:

global ftp_client # does it reference the variable of the outer scope?
self.ftp_client = ftplib.FTP['foo']

Bạn tuyên bố

global ftp_client # does it reference the variable of the outer scope?
self.ftp_client = ftplib.FTP['foo']
0 là một biến toàn cầu. Điều này có nghĩa là nó sống ở cấp độ mô -đun [ví dụ như các lớp học của bạn].

Dòng thứ hai là sai. Bạn muốn gán cho biến toàn cầu nhưng thay vào đó bạn đặt một thuộc tính thể hiện cùng tên.

Nó nên là:

global ftp_client
ftp_client = ftplib.FTP['foo']

Nhưng hãy để tôi đề xuất một cách tiếp cận khác. Một thực tế phổ biến là đặt những thứ như vậy trong lớp, vì nó được chia sẻ bởi tất cả các trường hợp của lớp này.

class FtpFileCommand[sublime_plugin.TextCommand]:
  ftp_client = None

  def run[self, args]:
    FtpFileCommand.ftp_client = ftplib.FTP['foo']
    # login and stuff

Lưu ý rằng phương thức không sử dụng

global ftp_client # does it reference the variable of the outer scope?
self.ftp_client = ftplib.FTP['foo']
6, vì vậy nó cũng có thể là một phương thức lớp:

class FtpFileCommand[sublime_plugin.TextCommand]:
  ftp_client = None

  @classmethod
  def run[cls, args]:
    cls.ftp_client = ftplib.FTP['foo']
    # login and stuff

Bằng cách này, bạn sẽ nhận được lớp làm đối số đầu tiên và bạn có thể sử dụng nó để truy cập vào máy khách FTP mà không cần sử dụng tên lớp.

Đã trả lời ngày 13 tháng 10 năm 2011 lúc 14:48Oct 13, 2011 at 14:48

Yakyakyak

8,5912 Huy hiệu vàng28 Huy hiệu bạc22 Huy hiệu đồng2 gold badges28 silver badges22 bronze badges

Nếu chỉ có một biến được chia sẻ duy nhất, thì toàn cầu là giải pháp đơn giản nhất. Nhưng lưu ý rằng một biến chỉ cần được khai báo với

global ftp_client # does it reference the variable of the outer scope?
self.ftp_client = ftplib.FTP['foo']
7 khi nó được gán cho. Nếu biến toàn cầu là một đối tượng, bạn có thể gọi các phương thức của nó, sửa đổi các thuộc tính của nó, v.v. mà không cần khai báo nó là toàn cầu trước.

Một giải pháp thay thế cho việc sử dụng các biến toàn cầu là sử dụng các thuộc tính lớp được truy cập bằng classMethods. Ví dụ:

class FtpFile[object]:
    _client = None

    @classmethod
    def client[cls]:
        return cls._client

    @classmethod
    def setClient[cls, client]:
        cls._client = client

class FtpFileCommand[FtpFile, sublime_plugin.TextCommand]:
    def run[self, args]:
        client = self.client[]

class FtpFileEventListener[FtpFile, sublime_plugin.EventListener]:
    def run[self, args]:
        client = self.client[]

Đã trả lời ngày 13 tháng 10 năm 2011 lúc 14:22Oct 13, 2011 at 14:22

Ekhumoroekhumoroekhumoro

111K19 Huy hiệu vàng216 Huy hiệu bạc323 Huy hiệu Đồng19 gold badges216 silver badges323 bronze badges

1

Bạn có thể thêm một hàm tạo cho mỗi lớp sau đó chuyển

global ftp_client # does it reference the variable of the outer scope?
self.ftp_client = ftplib.FTP['foo']
0 dưới dạng đối số không?

class FtpFileCommand[sublime_plugin.TextCommand]:
    ...
    def __init__[self, ftp_client]:
        self.ftp_client = ftp_client
    ...

class FtpFileEventListener[sublime_plugin.EventListener]:
    ...
    def __init__[self, ftp_client]:
        self.ftp_client = ftp_client
    ...

Đã trả lời ngày 13 tháng 10 năm 2011 lúc 13:19Oct 13, 2011 at 13:19

Ian Oxleyian OxleyIan Oxley

10,8K6 Huy hiệu vàng41 Huy hiệu bạc48 Huy hiệu đồng6 gold badges41 silver badges48 bronze badges

2

Yak ... Cảm ơn bạn rất nhiều vì điều này !!!

Bạn tuyên bố ftp_client là một biến toàn cầu. Điều này có nghĩa là nó sống ở cấp độ mô -đun [ví dụ như các lớp học của bạn].

Tôi đã gặp khó khăn khi cố gắng viết chương trình của mình "đúng" nơi tôi sử dụng các lớp và chức năng và không thể gọi bất kỳ biến nào. Tôi nhận ra rằng toàn cầu sẽ làm cho nó có sẵn bên ngoài lớp học. Khi tôi đọc rằng tôi đã nghĩ ... nếu nó sống bên ngoài lớp thì biến tôi cần lấy từ tập lệnh PY mà tôi đang nhập mô -đun đó sẽ là:

module.variable

Và sau đó trong mô -đun đó, tôi đã tuyên bố một biến toàn cầu khác để gọi nó từ tập lệnh chính ... vì vậy ví dụ ...

#Main Script main.py
import moduleA

print[moduleA.moduleA.variable]


#ModuleA code moduleA.py
import moduleB

class classA[]:

    def functionA[]:

      global moduleA_variable
      call.something.from.moduleB.classB.functionB[]
      moduleA_variable = moduleB.moduleB_variable

Mã mô -đun ModuleB.py

class classB[]:

     def functionB[]:

      global moduleB_variable
      moduleB_variable = retrieve.tacos[]

Tôi hy vọng lời giải thích của tôi cũng giúp đỡ ai đó. Tôi là người mới bắt đầu với Python và đấu tranh với điều này trong một thời gian. Trong trường hợp không rõ ràng ... Tôi đã có các mô -đun tùy chỉnh riêng được tạo thành từ một vài tệp .py khác nhau. Main đã gọi Modulea và Modulea đã gọi ModuleB. Tôi đã phải trả biến lên chuỗi cho tập lệnh chính. Quan điểm của tôi làm theo cách này, là giữ cho tập lệnh chính sạch sẽ cho hầu hết các phần, và tự thiết lập để thực hiện các nhiệm vụ lặp đi lặp lại mà không phải viết các trang tào lao. Về cơ bản cố gắng tái sử dụng các chức năng thay vì viết một cuốn sách.

Martin Evans

44.5K16 Huy hiệu vàng80 Huy hiệu bạc91 Huy hiệu Đồng16 gold badges80 silver badges91 bronze badges

Đã trả lời ngày 6 tháng 10 năm 2017 lúc 15:58Oct 6, 2017 at 15:58

Chúng ta có thể khai báo các biến ở bất cứ đâu trong Python không?

Bạn có thể tạo một biến với phạm vi toàn cầu bằng cách khởi tạo bên ngoài tất cả các chức năng trong chương trình Python.Và bạn có thể truy cập biến từ bất cứ nơi nào trong chương trình Python.. And you can access the variable from anywhere in the python program.

Chúng ta có thể khai báo biến bên ngoài chức năng không?

Trong Python và hầu hết các ngôn ngữ lập trình, các biến được khai báo bên ngoài một hàm được gọi là các biến toàn cầu.Bạn có thể truy cập các biến như vậy bên trong và bên ngoài một hàm, vì chúng có phạm vi toàn cầu.Biến X trong mã trên được khai báo bên ngoài hàm: x = 10.variables declared outside a function are known as global variables. You can access such variables inside and outside of a function, as they have global scope. The variable x in the code above was declared outside a function: x = 10 .

Một biến được xác định bên ngoài là gì?

Các biến được xác định bên ngoài một hàm, chúng được gọi là các biến toàn cầu và phạm vi của chúng là toàn cầu.Các biến được xác định bên trong một hàm là các biến cục bộ.

Bạn có thể truy cập một biến công khai bên ngoài lớp học của nó không?

Truy cập riêng và công khai Bạn có thể đọc hoặc ghi vào biến từ bất cứ nơi nào trong mô -đun, lớp hoặc cấu trúc, nhưng không phải từ bên ngoài nó.not from outside it.

Bài Viết Liên Quan

Chủ Đề