Hướng dẫn how do you check if an object has been initialized in python? - làm cách nào để kiểm tra xem một đối tượng đã được khởi tạo trong python chưa?

Cách kiểm tra xem một đối tượng đã được khởi tạo bằng Python? Tôi có my_tac = tac(EDL_port) ở nhiều nơi, trong trường hợp nó đã được khởi tạo, nó ném một lỗi được hiển thị bên dưới..tôi muốn thêm kiểm tra nếu my_tac được khởi tạo hay không, làm thế nào để làm cái đó? MÃ SỐ:-

#From another file
my_tac = tac(EDL_port)

#alpha.py
class tac:
   ## tac class constructor.
   #
   #  @param self
   #  @param timeout
   #  @param baud_rate
   def __init__(self, port=None, timeout=0.3, baud_rate=115200):
      if port is not None:
         self.port = port
         self.ser = serial.Serial(self.port, baud_rate, timeout=timeout)
         return
      else:
         (tac_ports,spider_ports) = tac_probe_for_devices()
         print "TAC ports..."
   ...................... 

ERROR:-

11/5/2016 8:54:05 PM: my_tac = tac(EDL_port)
11/5/2016 8:54:05 PM: File "C:\CST_QSPR\third_party_bin\BuildLoaderScripts\Android\android_dl\alpaca.py", line 90, in __init__
11/5/2016 8:54:05 PM: self.ser = serial.Serial(self.port, baud_rate, timeout=timeout)
11/5/2016 8:54:05 PM: File "C:\Python27\lib\site-packages\serial\serialwin32.py", line 31, in __init__
11/5/2016 8:54:05 PM: ERROR:adb -s C2687475 remount failed
11/5/2016 8:54:05 PM: super(Serial, self).__init__(*args, **kwargs)
11/5/2016 8:54:05 PM: File "C:\Python27\lib\site-packages\serial\serialutil.py", line 236, in __init__
11/5/2016 8:54:05 PM: self.open()
11/5/2016 8:54:05 PM: File "C:\Python27\lib\site-packages\serial\serialwin32.py", line 62, in open
11/5/2016 8:54:05 PM: raise SerialException("could not open port {!r}: {!r}".format(self.portstr, ctypes.WinError()))
11/5/2016 8:54:05 PM: serial.serialutil.SerialException: could not open port 'COM8': WindowsError(5, 'Access is denied.')

Kiểm tra nếu một biến được xác định

Tín dụng: Hamish Lawson

Vấn đề

Bạn muốn thực hiện các khóa học hành động khác nhau dựa trên việc một biến có được xác định hay không.

Dung dịch

Trong Python, tất cả các biến dự kiến ​​sẽ được xác định trước khi sử dụng. Đối tượng None là một giá trị bạn thường gán để biểu thị rằng bạn không có giá trị thực cho một biến, như trong:

try: x
except NameError: x = None

Sau đó, nó dễ dàng kiểm tra xem một biến có bị ràng buộc với None:

if x is None:
    some_fallback_operation(  )
else:
    some_operation(x)

Thảo luận

Python không có chức năng cụ thể để kiểm tra xem một biến có được xác định hay không, vì tất cả các biến dự kiến ​​đã được xác định trước khi sử dụng, ngay cả khi ban đầu được gán cho đối tượng None. Cố gắng truy cập vào một biến đã được xác định trước đây sẽ tăng ngoại lệ

11/5/2016 8:54:05 PM: my_tac = tac(EDL_port)
11/5/2016 8:54:05 PM: File "C:\CST_QSPR\third_party_bin\BuildLoaderScripts\Android\android_dl\alpaca.py", line 90, in __init__
11/5/2016 8:54:05 PM: self.ser = serial.Serial(self.port, baud_rate, timeout=timeout)
11/5/2016 8:54:05 PM: File "C:\Python27\lib\site-packages\serial\serialwin32.py", line 31, in __init__
11/5/2016 8:54:05 PM: ERROR:adb -s C2687475 remount failed
11/5/2016 8:54:05 PM: super(Serial, self).__init__(*args, **kwargs)
11/5/2016 8:54:05 PM: File "C:\Python27\lib\site-packages\serial\serialutil.py", line 236, in __init__
11/5/2016 8:54:05 PM: self.open()
11/5/2016 8:54:05 PM: File "C:\Python27\lib\site-packages\serial\serialwin32.py", line 62, in open
11/5/2016 8:54:05 PM: raise SerialException("could not open port {!r}: {!r}".format(self.portstr, ctypes.WinError()))
11/5/2016 8:54:05 PM: serial.serialutil.SerialException: could not open port 'COM8': WindowsError(5, 'Access is denied.')
2 (mà bạn có thể xử lý với câu lệnh ____ 13/________ 14, vì bạn có thể cho bất kỳ ngoại lệ Python nào khác).

Nó được coi là bất thường trong Python không biết liệu một biến đã được xác định. Nhưng nếu bạn vẫn còn trong tình huống này, bạn có thể đảm bảo rằng một biến nhất định trên thực tế được xác định (là None, nếu không có gì khác) bằng cách cố gắng truy cập nó trong một mệnh đề

11/5/2016 8:54:05 PM: my_tac = tac(EDL_port)
11/5/2016 8:54:05 PM: File "C:\CST_QSPR\third_party_bin\BuildLoaderScripts\Android\android_dl\alpaca.py", line 90, in __init__
11/5/2016 8:54:05 PM: self.ser = serial.Serial(self.port, baud_rate, timeout=timeout)
11/5/2016 8:54:05 PM: File "C:\Python27\lib\site-packages\serial\serialwin32.py", line 31, in __init__
11/5/2016 8:54:05 PM: ERROR:adb -s C2687475 remount failed
11/5/2016 8:54:05 PM: super(Serial, self).__init__(*args, **kwargs)
11/5/2016 8:54:05 PM: File "C:\Python27\lib\site-packages\serial\serialutil.py", line 236, in __init__
11/5/2016 8:54:05 PM: self.open()
11/5/2016 8:54:05 PM: File "C:\Python27\lib\site-packages\serial\serialwin32.py", line 62, in open
11/5/2016 8:54:05 PM: raise SerialException("could not open port {!r}: {!r}".format(self.portstr, ctypes.WinError()))
11/5/2016 8:54:05 PM: serial.serialutil.SerialException: could not open port 'COM8': WindowsError(5, 'Access is denied.')
3 và gán nó cho đối tượng None nếu truy cập tăng
11/5/2016 8:54:05 PM: my_tac = tac(EDL_port)
11/5/2016 8:54:05 PM: File "C:\CST_QSPR\third_party_bin\BuildLoaderScripts\Android\android_dl\alpaca.py", line 90, in __init__
11/5/2016 8:54:05 PM: self.ser = serial.Serial(self.port, baud_rate, timeout=timeout)
11/5/2016 8:54:05 PM: File "C:\Python27\lib\site-packages\serial\serialwin32.py", line 31, in __init__
11/5/2016 8:54:05 PM: ERROR:adb -s C2687475 remount failed
11/5/2016 8:54:05 PM: super(Serial, self).__init__(*args, **kwargs)
11/5/2016 8:54:05 PM: File "C:\Python27\lib\site-packages\serial\serialutil.py", line 236, in __init__
11/5/2016 8:54:05 PM: self.open()
11/5/2016 8:54:05 PM: File "C:\Python27\lib\site-packages\serial\serialwin32.py", line 62, in open
11/5/2016 8:54:05 PM: raise SerialException("could not open port {!r}: {!r}".format(self.portstr, ctypes.WinError()))
11/5/2016 8:54:05 PM: serial.serialutil.SerialException: could not open port 'COM8': WindowsError(5, 'Access is denied.')
2 ngoại lệ. Lưu ý rằng None thực sự không có gì kỳ diệu, chỉ là một đối tượng tích hợp được sử dụng bởi quy ước (và được trả về bởi các chức năng thoát mà không trả lại bất cứ điều gì cụ thể). Bạn có thể sử dụng bất kỳ giá trị nào khác phù hợp cho mục đích của mình để khởi tạo các biến không xác định; Để biết ví dụ mạnh mẽ và thú vị, xem Công thức 5.24.

Thay vì đảm bảo rằng một biến được khởi tạo, bạn có thể thích kiểm tra xem nó có được xác định ở nơi bạn muốn sử dụng không:

try: x
except NameError: some_fallback_operation(  )
else: some_operation(x)

Đây là một sự thay thế hoàn toàn có thể chấp nhận được cho mã trong công thức, và một số người sẽ nói rằng nó có nhiều pythonic hơn. Tuy nhiên, lưu ý rằng nếu bạn chọn giải pháp thay thế này, bạn phải viết mã theo thứ tự này: trường hợp dị thường, lỗi trước, thì trường hợp bình thường, không lỗi. Với cách tiếp cận công thức, bạn có thể muốn đảo ngược điều kiện bảo vệ thành

try: x
except NameError: x = None
0 và mã hóa trường hợp bình thường trước. Những điểm này là minutiae, để chắc chắn, nhưng đôi khi sự rõ ràng có thể được cải thiện theo cách này. Hơn nữa, bạn phải cẩn thận để tránh sự thay đổi trong phương án này:

try:
    x
    some_operation(x)
except NameError:
    some_fallback_operation(  )

Trong biến thể này, cuộc gọi đến

try: x
except NameError: x = None
1 cũng được bao phủ bởi trình xử lý ngoại lệ, vì vậy nếu có lỗi trong hàm
try: x
except NameError: x = None
1 hoặc trong bất kỳ chức năng nào được gọi từ nó, mã này sẽ che dấu lỗi và dường như tiến hành hoạt động bình thường khi nó nên thất bại với một thông báo lỗi. Bạn phải luôn cẩn thận rằng các điều khoản
11/5/2016 8:54:05 PM: my_tac = tac(EDL_port)
11/5/2016 8:54:05 PM: File "C:\CST_QSPR\third_party_bin\BuildLoaderScripts\Android\android_dl\alpaca.py", line 90, in __init__
11/5/2016 8:54:05 PM: self.ser = serial.Serial(self.port, baud_rate, timeout=timeout)
11/5/2016 8:54:05 PM: File "C:\Python27\lib\site-packages\serial\serialwin32.py", line 31, in __init__
11/5/2016 8:54:05 PM: ERROR:adb -s C2687475 remount failed
11/5/2016 8:54:05 PM: super(Serial, self).__init__(*args, **kwargs)
11/5/2016 8:54:05 PM: File "C:\Python27\lib\site-packages\serial\serialutil.py", line 236, in __init__
11/5/2016 8:54:05 PM: self.open()
11/5/2016 8:54:05 PM: File "C:\Python27\lib\site-packages\serial\serialwin32.py", line 62, in open
11/5/2016 8:54:05 PM: raise SerialException("could not open port {!r}: {!r}".format(self.portstr, ctypes.WinError()))
11/5/2016 8:54:05 PM: serial.serialutil.SerialException: could not open port 'COM8': WindowsError(5, 'Access is denied.')
3 của bạn (trong các câu lệnh ____ 13/________ 14) Không vô tình bao gồm nhiều mã hơn bạn thực sự có ý định bao gồm, điều này có thể dễ dàng che dấu lỗi. Điều khoản
try: x
except NameError: x = None
6 trong câu lệnh ____ 13/________ 14 dành cho mã chỉ nên thực thi nếu không có ngoại lệ nào được nêu ra nhưng không nên được xử lý bởi người xử lý ngoại lệ, vì bạn không mong đợi các ngoại lệ từ nó và muốn chẩn đoán vấn đề ngay lập tức nếu các trường hợp ngoại lệ xảy ra.

Nhiều tình huống mà bạn có thể nghĩ sẽ tự nhiên làm phát sinh các biến không xác định, chẳng hạn như xử lý các tệp cấu hình hoặc biểu mẫu web, được xử lý tốt hơn bằng cách sử dụng từ điển và thử nghiệm cho sự hiện diện của khóa (với phương pháp

try: x
except NameError: x = None
9, ________ 13/________ 14 hoặc các phương pháp
if x is None:
    some_fallback_operation(  )
else:
    some_operation(x)
2 hoặc
if x is None:
    some_fallback_operation(  )
else:
    some_operation(x)
3 của các đối tượng từ điển). Ví dụ: thay vì xử lý tệp cấu hình người dùng theo cách này:

execfile('userconfig')
try: background_color
except NameError: background_color = 'black'
try: foreground_color
except NameError: foreground_color = 'white'
...

làm như thế này:

config = dict(globals(  ))
execfile('userconfig', config)
background_color = config.get('background_color', 'black')
foreground_color = config.get('foreground_color', 'white')
...

if x is None:
    some_fallback_operation(  )
else:
    some_operation(x)
4 yêu cầu Python 2.2, nhưng bạn có thể có được hiệu ứng tương tự trong các phiên bản Python trước đó bằng cách sử dụng
if x is None:
    some_fallback_operation(  )
else:
    some_operation(x)
5 thay thế. Sử dụng một từ điển được chỉ định rõ ràng cho
if x is None:
    some_fallback_operation(  )
else:
    some_operation(x)
6,
if x is None:
    some_fallback_operation(  )
else:
    some_operation(x)
7 và
if x is None:
    some_fallback_operation(  )
else:
    some_operation(x)
8 dù sao cũng được khuyến khích, để kiểm soát không gian tên của bạn. Một trong nhiều lợi ích của việc sử dụng một từ điển được chỉ định rõ ràng như vậy, như được hiển thị ở đây, bạn không cần phải lo lắng về các biến không xác định mà chỉ cần sử dụng phương thức ____32 của từ điển để tìm nạp từng khóa với giá trị mặc định được chỉ định rõ ràng để được sử dụng để được sử dụng Nếu chìa khóa không có trong từ điển.

Nếu bạn biết chắc chắn rằng không gian tên nào là biến trong (nghĩa là, cụ thể là

try: x
except NameError: some_fallback_operation(  )
else: some_operation(x)
0 hoặc cụ thể
try: x
except NameError: some_fallback_operation(  )
else: some_operation(x)
1), bạn cũng có thể sử dụng các phương thức như
try: x
except NameError: x = None
9 hoặc
if x is None:
    some_fallback_operation(  )
else:
    some_operation(x)
2 trên từ điển có liên quan. Tuy nhiên, các biến trong cả
try: x
except NameError: some_fallback_operation(  )
else: some_operation(x)
0 cũng như
try: x
except NameError: some_fallback_operation(  )
else: some_operation(x)
1 có thể tồn tại (nhờ tính năng phạm vi lồng nhau là tùy chọn trong Python 2.1, nhưng luôn ở trong Python 2.2 trở lên). Ngoài ra, các thư mục không gian tên đặc biệt được trả lại bởi
try: x
except NameError: some_fallback_operation(  )
else: some_operation(x)
0 và
try: x
except NameError: some_fallback_operation(  )
else: some_operation(x)
1 không phù hợp với các phương pháp đột biến như
if x is None:
    some_fallback_operation(  )
else:
    some_operation(x)
3, do đó, bạn vẫn nên sắp xếp để sử dụng từ điển rõ ràng của riêng bạn thay vì không gian tên địa phương hoặc toàn cầu, bất cứ khi nào khả thi.

Điều gì xảy ra khi đối tượng được khởi tạo trong Python?

Khởi tạo đối tượng Python Khi chúng ta tạo đối tượng cho một lớp, phương thức __init __ () được gọi.Chúng tôi sử dụng điều này để điền vào các giá trị vào các thuộc tính khi chúng tôi tạo một đối tượng.Ở đây, __init __ () có hai thuộc tính ngoài 'màu tự và hình dạng.Sau đó, chúng tôi vượt qua các đối số tương ứng cho những điều này tại thời điểm tạo đối tượng.fill in values to attributes when we create a object. Here, __init__() has two attributes apart from 'self'- color and shape. Then, we pass corresponding arguments for these at the time of object creation.

Điều gì được khởi tạo trong Python?

Phương pháp __init__ là tương đương Python của hàm tạo C ++ theo cách tiếp cận hướng đối tượng.Hàm __init__ được gọi mỗi khi một đối tượng được tạo từ một lớp.Phương thức __init__ cho phép lớp khởi tạo các thuộc tính của đối tượng và không phục vụ mục đích nào khác.Nó chỉ được sử dụng trong các lớp học.lets the class initialize the object's attributes and serves no other purpose. It is only used within classes.

Có cái gì bên trong__?

"__init__" là một phương pháp được phát triển trong các lớp Python.Nó được gọi là một hàm tạo trong thuật ngữ định hướng đối tượng.Phương thức này được gọi là khi một đối tượng được tạo từ một lớp và nó cho phép lớp khởi tạo các thuộc tính của lớp.a reseved method in python classes. It is called as a constructor in object oriented terminology. This method is called when an object is created from a class and it allows the class to initialize the attributes of the class.