Hướng dẫn python check object has attribute - đối tượng kiểm tra python có thuộc tính

Một lựa chọn khả thi khác, nhưng nó phụ thuộc vào ý nghĩa của bạn trước đây:

undefined = object()

class Widget:

    def __init__(self):
        self.bar = 1

    def zoom(self):
        print("zoom!")

a = Widget()

bar = getattr(a, "bar", undefined)
if bar is not undefined:
    print("bar:%s" % (bar))

foo = getattr(a, "foo", undefined)
if foo is not undefined:
    print("foo:%s" % (foo))

zoom = getattr(a, "zoom", undefined)
if zoom is not undefined:
    zoom()

output:

bar:1
zoom!

Điều này cho phép bạn thậm chí kiểm tra các thuộc tính không có giá trị.

Nhưng mà! Hãy cẩn thận, bạn không vô tình khởi tạo và so sánh undefined nhiều nơi vì is sẽ không bao giờ hoạt động trong trường hợp đó.

Update:

Do những gì tôi đã cảnh báo trong đoạn trên, có nhiều bản không xác định không bao giờ khớp, gần đây tôi đã sửa đổi một chút mẫu này:

undefined = NotImplemented

NotImplemented, không bị nhầm lẫn với NotImplementedError, là một tích hợp: nó bán kết hợp với mục đích của JS undefined và bạn có thể sử dụng lại định nghĩa của nó ở mọi nơi và nó sẽ luôn phù hợp. Hạn chế là nó là "sự thật" trong Booleans và nó có thể trông kỳ lạ trong các bản ghi và dấu vết xếp chồng (nhưng bạn nhanh chóng vượt qua nó khi bạn biết nó chỉ xuất hiện trong bối cảnh này).

Vì mọi thứ trong Python là một đối tượng và các đối tượng có các thuộc tính (trường và phương thức), nên việc viết các chương trình có thể kiểm tra loại thuộc tính nào mà một đối tượng có. Ví dụ, một chương trình Python có thể mở một ổ cắm trên máy chủ và nó chấp nhận các tập lệnh Python được gửi qua mạng từ máy khách. Khi nhận được tập lệnh mới, chương trình Python phía máy chủ có thể kiểm tra hoặc chính xác hơn các đối tượng, mô-đun và chức năng nội tâm trong tập lệnh mới để quyết định cách thực hiện chức năng, đăng nhập kết quả và các tác vụ hữu ích khác nhau.

Hasattr so với Try-Except

Có hai cách để kiểm tra xem một đối tượng Python có thuộc tính hay không. Cách đầu tiên là gọi hàm tích hợp hasattr(object, name), trả về True nếu chuỗi ____10 là tên của một trong các thuộc tính của ____ 11,

bar:1
zoom!
2 nếu không. Cách thứ hai là
bar:1
zoom!
3 để truy cập một thuộc tính trong một
bar:1
zoom!
1 và thực hiện một số chức năng khác nếu một
bar:1
zoom!
5 được nâng lên.

.
>>> hasattr('abc', 'upper')
True
>>> hasattr('abc', 'lower')
True
>>> hasattr('abc', 'convert')
False
[/python]

And:

[Python] >>> thử: ... 'abc'.upper () ... ngoại trừ thuộc tính : ....
>>> try:
... 'abc'.upper()
... except AttributeError:
... print("abc does not have attribute 'upper'")
...
'ABC'
>>> try:
... 'abc'.convert()
... except AttributeError:
... print("abc does not have attribute 'convert'")
...
abc does not have attribute 'convert'
[/python]

Sự khác biệt giữa hai phong cách này là gì?

bar:1
zoom!
6 thường được gọi là kiểu lập trình Python có tên "Nhìn trước khi bạn nhảy" (LByl) vì bạn kiểm tra xem một đối tượng có thuộc tính hay không trước khi bạn truy cập. Trong khi
bar:1
zoom!
7 được gọi là "dễ dàng yêu cầu tha thứ hơn sự cho phép" (EAFP) vì bạn
bar:1
zoom!
3 Truy cập thuộc tính trước và yêu cầu tha thứ trong khối
bar:1
zoom!
9 thay vì xin phép như
bar:1
zoom!
6.

Cách nào tốt hơn, sau đó? Chà, cả hai học thuyết đều có những người ủng hộ trung thành và cả hai phong cách dường như rất thành thạo để đối phó với bất kỳ thử thách lập trình trong thế giới thực. Đôi khi, thật hợp lý khi sử dụng LByl nếu bạn muốn đảm bảo một thuộc tính chắc chắn tồn tại và dừng thực thi nếu không. Ví dụ: bạn biết chắc chắn tại một điểm trong chương trình rằng

bar:1
zoom!
1 được thông qua sẽ có thuộc tính con trỏ tệp hợp lệ mà mã sau có thể hoạt động. Mặt khác, việc sử dụng EAFP cũng có ý nghĩa nếu bạn biết một thuộc tính có thể không tồn tại tại một số điểm trong quá trình thực hiện chương trình. Ví dụ, một trình phát nhạc không thể đảm bảo tệp MP3 luôn luôn ở cùng một vị trí, bởi vì nó có thể bị xóa, sửa đổi hoặc di chuyển bởi người dùng bất cứ lúc nào. Trong trường hợp này, trình phát nhạc có thể
bar:1
zoom!
3 truy cập tệp MP3 trước và thông báo cho người dùng rằng tệp không tồn tại trong khối
bar:1
zoom!
9.

Hasattr vs __dict__

Mặc dù

bar:1
zoom!
6 là một hàm tích hợp được thiết kế để kiểm tra xem thuộc tính có tồn tại trong một đối tượng hay không, đôi khi có thể chính xác hơn để kiểm tra undefined5 của đối tượng cho sự tồn tại của một thuộc tính thay vì thực tế là
bar:1
zoom!
6 không quan tâm đến lý do tại sao thuộc tính được gắn vào một đối tượng trong khi bạn có thể muốn biết lý do tại sao một thuộc tính được gắn vào một đối tượng. Ví dụ, một thuộc tính có thể được gắn vào một đối tượng do lớp cha của nó thay vì chính đối tượng.

[Python] >>> Lớp A (đối tượng): ... foo = 1 ... >>> Lớp B (a): ... Pass ... >>> B = B () >>> Hasattr ( B, 'foo') Đúng >>> 'foo' trong b .__ dict__ false [/python]
>>> class A(object):
... foo = 1
...
>>> class B(A):
... pass
...
>>> b = B()
>>> hasattr(b, 'foo')
True
>>> 'foo' in b.__dict__
False
[/python]

Trong mã trước, vì lớp undefined7 là một lớp con của lớp undefined8, lớp undefined7 cũng có thuộc tính "foo". Tuy nhiên, vì "foo" được kế thừa từ undefined8, is1 không chứa nó. Đôi khi, điều quan trọng là phải biết liệu một thuộc tính đến từ bản thân lớp của một đối tượng hay từ siêu lớp của các đối tượng.

Lời khuyên và đề xuất

  • bar:1
    zoom!
    
    6 tuân theo nguyên tắc gõ con vịt trong Python: Khi tôi thấy một con chim đi bộ như một con vịt và bơi như một con vịt và những con vịt như một con vịt, tôi gọi con chim đó là một con vịt.

    When I see a bird that walks like a duck and swims like a duck and quacks like a duck, I call that bird a duck.

    Vì vậy, hầu hết thời gian bạn muốn sử dụng

    bar:1
    zoom!
    
    6 để kiểm tra xem một thuộc tính có tồn tại trong một đối tượng không.

  • bar:1
    zoom!
    
    7 và undefined5 có các trường hợp sử dụng riêng thực sự khá hẹp so với
    bar:1
    zoom!
    
    6. Vì vậy, có lợi khi giữ các trường hợp sử dụng đặc biệt này ở phía sau đầu để bạn sẽ nhận ra chúng trong quá trình mã hóa và sử dụng các thành ngữ thích hợp cho phù hợp.

Khi bạn đã học cách kiểm tra xem một đối tượng có thuộc tính trong Python không, hãy kiểm tra cách lấy thuộc tính từ một đối tượng.

Làm thế nào để bạn kiểm tra xem một đối tượng có thuộc tính trong Python không?

Chúng ta có thể sử dụng hàm HasAttr () để tìm nếu một đối tượng Python obj có một thuộc tính hoặc thuộc tính nhất định.Hasattr (obj, 'thuộc tính'): Công ước trong Python là, nếu tài sản có thể ở đó, chỉ cần gọi nó và bắt nó với một khối thử/ngoại trừ.use hasattr() function to find if a python object obj has a certain attribute or property. hasattr(obj, 'attribute'): The convention in python is that, if the property is likely to be there, simply call it and catch it with a try/except block.

Làm thế nào để bạn kiểm tra xem một đối tượng có thuộc tính?

Nếu bạn muốn xác định xem một đối tượng nhất định có thuộc tính cụ thể thì phương thức HasAttr () có phải là những gì bạn đang tìm kiếm hay không.Phương thức chấp nhận hai đối số, đối tượng và thuộc tính ở định dạng chuỗi.hasattr() method is what you are looking for. The method accepts two arguments, the object and the attribute in string format.

Làm thế nào để bạn kiểm tra xem một đối tượng không có thuộc tính Python?

Giá trị trả về HasAttr () Phương thức HasAttr () trả về: true - Nếu đối tượng có thuộc tính được đặt ra.Sai - Nếu đối tượng không có thuộc tính được đặt tên. Return Value The hasattr() method returns: True - if object has the given named attribute. False - if object has no given named attribute.

Làm thế nào để bạn kiểm tra giá trị của một đối tượng trong Python?

Cách xác định giá trị của một đối tượng trong Python..
Loại (OBJ) Trả về loại đối tượng ..
id (obj) trả về id của đối tượng ..