Hướng dẫn how do you print the attributes of an object in python? - làm thế nào để bạn in các thuộc tính của một đối tượng trong python?

Có chức năng tích hợp để in tất cả các thuộc tính và giá trị hiện tại của một đối tượng không?

Không. Câu trả lời được nâng cấp nhiều nhất không bao gồm một số loại thuộc tính và câu trả lời được chấp nhận cho thấy cách lấy tất cả các thuộc tính, bao gồm các phương thức và các phần của API không công khai. Nhưng không có chức năng xây dựng hoàn chỉnh tốt cho việc này.

Vì vậy, hệ quả ngắn là bạn có thể tự viết, nhưng nó sẽ tính toán các thuộc tính và các mô tả dữ liệu được tính toán khác là một phần của API công khai và bạn có thể không muốn điều đó:

from pprint import pprint
from inspect import getmembers
from types import FunctionType

def attributes(obj):
    disallowed_names = {
      name for name, value in getmembers(type(obj)) 
        if isinstance(value, FunctionType)}
    return {
      name: getattr(obj, name) for name in dir(obj) 
        if name[0] != '_' and name not in disallowed_names and hasattr(obj, name)}

def print_attributes(obj):
    pprint(attributes(obj))

Vấn đề với các câu trả lời khác

Quan sát ứng dụng của câu trả lời hiện tại được bỏ phiếu hàng đầu trên một lớp với rất nhiều loại thành viên dữ liệu khác nhau:

from pprint import pprint

class Obj:
    __slots__ = 'foo', 'bar', '__dict__'
    def __init__(self, baz):
        self.foo = ''
        self.bar = 0
        self.baz = baz
    @property
    def quux(self):
        return self.foo * self.bar

obj = Obj('baz')
pprint(vars(obj))

Chỉ in:

{'baz': 'baz'}

Bởi vì

from pprint import pprint

class Obj:
    __slots__ = 'foo', 'bar', '__dict__'
    def __init__(self, baz):
        self.foo = ''
        self.bar = 0
        self.baz = baz
    @property
    def quux(self):
        return self.foo * self.bar

obj = Obj('baz')
pprint(vars(obj))
2 chỉ trả về
from pprint import pprint

class Obj:
    __slots__ = 'foo', 'bar', '__dict__'
    def __init__(self, baz):
        self.foo = ''
        self.bar = 0
        self.baz = baz
    @property
    def quux(self):
        return self.foo * self.bar

obj = Obj('baz')
pprint(vars(obj))
3 của một đối tượng và nó không phải là một bản sao, vì vậy nếu bạn sửa đổi dict được trả về bởi VAR, bạn cũng sẽ sửa đổi
from pprint import pprint

class Obj:
    __slots__ = 'foo', 'bar', '__dict__'
    def __init__(self, baz):
        self.foo = ''
        self.bar = 0
        self.baz = baz
    @property
    def quux(self):
        return self.foo * self.bar

obj = Obj('baz')
pprint(vars(obj))
3 của chính đối tượng.

vars(obj)['quux'] = 'WHAT?!'
vars(obj)

Trả lại:

{'baz': 'baz', 'quux': 'WHAT?!'}

- Điều này xấu vì Quux là một tài sản mà chúng ta không nên đặt và không nên ở trong không gian tên ...

Áp dụng lời khuyên trong câu trả lời hiện đang được chấp nhận (và những người khác) không tốt hơn nhiều:

>>> dir(obj)
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__slots__', '__str__', '__subclasshook__', 'bar', 'baz', 'foo', 'quux']

Như chúng ta có thể thấy,

from pprint import pprint

class Obj:
    __slots__ = 'foo', 'bar', '__dict__'
    def __init__(self, baz):
        self.foo = ''
        self.bar = 0
        self.baz = baz
    @property
    def quux(self):
        return self.foo * self.bar

obj = Obj('baz')
pprint(vars(obj))
5 chỉ trả về tất cả (thực sự chỉ là hầu hết) các tên liên quan đến một đối tượng.

from pprint import pprint

class Obj:
    __slots__ = 'foo', 'bar', '__dict__'
    def __init__(self, baz):
        self.foo = ''
        self.bar = 0
        self.baz = baz
    @property
    def quux(self):
        return self.foo * self.bar

obj = Obj('baz')
pprint(vars(obj))
6, được đề cập trong các bình luận, tương tự như thiếu sót - nó trả về tất cả các tên và giá trị.

Từ lớp học

Khi dạy tôi, học sinh của mình tạo ra một chức năng cung cấp API công khai về ngữ nghĩa của một đối tượng:

def api(obj):
    return [name for name in dir(obj) if name[0] != '_']

Chúng tôi có thể mở rộng điều này để cung cấp một bản sao của không gian tên ngữ nghĩa của một đối tượng, nhưng chúng tôi cần loại trừ

from pprint import pprint

class Obj:
    __slots__ = 'foo', 'bar', '__dict__'
    def __init__(self, baz):
        self.foo = ''
        self.bar = 0
        self.baz = baz
    @property
    def quux(self):
        return self.foo * self.bar

obj = Obj('baz')
pprint(vars(obj))
7 không được gán và nếu chúng tôi thực hiện yêu cầu "thuộc tính hiện tại" một cách nghiêm túc, chúng tôi cần loại trừ các thuộc tính được tính toán ( vì chúng có thể trở nên đắt đỏ, và có thể được hiểu là không phải là "hiện tại"):

from types import FunctionType
from inspect import getmembers

def attrs(obj):
    disallowed_properties = {
        name for name, value in getmembers(type(obj)) 
        if isinstance(value, (property, FunctionType))
    }
    return {
        name: getattr(obj, name) for name in api(obj) 
        if name not in disallowed_properties and hasattr(obj, name)
    }

Và bây giờ chúng tôi không tính toán hoặc hiển thị tài sản, Quux:

________số 8

Hãy cẩn thận

Nhưng có lẽ chúng ta biết tài sản của chúng ta không đắt tiền. Chúng tôi có thể muốn thay đổi logic để bao gồm chúng. Và có lẽ chúng tôi muốn loại trừ các mô tả dữ liệu tùy chỉnh khác thay thế.custom data descriptors instead.

Sau đó, chúng ta cần tùy chỉnh thêm chức năng này. Và vì vậy, có ý nghĩa rằng chúng ta không thể có một chức năng tích hợp mà phép một cách kỳ diệu biết chính xác những gì chúng ta muốn và cung cấp nó. Đây là chức năng mà chúng ta cần để tạo ra chính mình.

Sự kết luận

Không có chức năng tích hợp nào làm điều này, và bạn nên làm những gì phù hợp nhất cho tình huống của bạn.

  1. In các thuộc tính của một đối tượng trong Python bằng hàm
    from pprint import pprint
    
    class Obj:
        __slots__ = 'foo', 'bar', '__dict__'
        def __init__(self, baz):
            self.foo = ''
            self.bar = 0
            self.baz = baz
        @property
        def quux(self):
            return self.foo * self.bar
    
    obj = Obj('baz')
    pprint(vars(obj))
    
    8 trong Python
  2. In các thuộc tính của một đối tượng trong Python bằng hàm
    from pprint import pprint
    
    class Obj:
        __slots__ = 'foo', 'bar', '__dict__'
        def __init__(self, baz):
            self.foo = ''
            self.bar = 0
            self.baz = baz
        @property
        def quux(self):
            return self.foo * self.bar
    
    obj = Obj('baz')
    pprint(vars(obj))
    
    9 trong Python

Các hàm

from pprint import pprint

class Obj:
    __slots__ = 'foo', 'bar', '__dict__'
    def __init__(self, baz):
        self.foo = ''
        self.bar = 0
        self.baz = baz
    @property
    def quux(self):
        return self.foo * self.bar

obj = Obj('baz')
pprint(vars(obj))
9, khi được gọi không có đối số, trả về từ điển với bảng ký hiệu cục bộ hiện tại. Nếu một đối tượng được chuyển đến hàm
from pprint import pprint

class Obj:
    __slots__ = 'foo', 'bar', '__dict__'
    def __init__(self, baz):
        self.foo = ''
        self.bar = 0
        self.baz = baz
    @property
    def quux(self):
        return self.foo * self.bar

obj = Obj('baz')
pprint(vars(obj))
9, nó sẽ trả về thuộc tính
from pprint import pprint

class Obj:
    __slots__ = 'foo', 'bar', '__dict__'
    def __init__(self, baz):
        self.foo = ''
        self.bar = 0
        self.baz = baz
    @property
    def quux(self):
        return self.foo * self.bar

obj = Obj('baz')
pprint(vars(obj))
3 của đối tượng. Nếu đối tượng được cung cấp dưới dạng đầu vào không có thuộc tính
from pprint import pprint

class Obj:
    __slots__ = 'foo', 'bar', '__dict__'
    def __init__(self, baz):
        self.foo = ''
        self.bar = 0
        self.baz = baz
    @property
    def quux(self):
        return self.foo * self.bar

obj = Obj('baz')
pprint(vars(obj))
3,
vars(obj)['quux'] = 'WHAT?!'
vars(obj)
6 sẽ được nâng lên.

Trong hướng dẫn này, chúng tôi sẽ xem xét làm thế nào để có được và in một thuộc tính của đối tượng trong Python.

In các thuộc tính của một đối tượng trong Python bằng hàm from pprint import pprint class Obj: __slots__ = 'foo', 'bar', '__dict__' def __init__(self, baz): self.foo = '' self.bar = 0 self.baz = baz @property def quux(self): return self.foo * self.bar obj = Obj('baz') pprint(vars(obj)) 8 trong Python

Hàm

from pprint import pprint

class Obj:
    __slots__ = 'foo', 'bar', '__dict__'
    def __init__(self, baz):
        self.foo = ''
        self.bar = 0
        self.baz = baz
    @property
    def quux(self):
        return self.foo * self.bar

obj = Obj('baz')
pprint(vars(obj))
8 tích hợp, khi được gọi không có đối số, trả về danh sách các tên trong phạm vi cục bộ hiện tại và khi một đối tượng được truyền dưới dạng đối số, nó sẽ trả về danh sách các thuộc tính hợp lệ của đối tượng.

Để in các thuộc tính của đối tượng, chúng ta cần chuyển đối tượng đến hàm

from pprint import pprint

class Obj:
    __slots__ = 'foo', 'bar', '__dict__'
    def __init__(self, baz):
        self.foo = ''
        self.bar = 0
        self.baz = baz
    @property
    def quux(self):
        return self.foo * self.bar

obj = Obj('baz')
pprint(vars(obj))
8 và in các thuộc tính của đối tượng được trả về bởi đối tượng
from pprint import pprint

class Obj:
    __slots__ = 'foo', 'bar', '__dict__'
    def __init__(self, baz):
        self.foo = ''
        self.bar = 0
        self.baz = baz
    @property
    def quux(self):
        return self.foo * self.bar

obj = Obj('baz')
pprint(vars(obj))
8. Chúng ta có thể sử dụng phương pháp
{'baz': 'baz'}
8 của mô-đun
{'baz': 'baz'}
9 để in các thuộc tính theo cách được định dạng tốt. Mã ví dụ dưới đây trình bày cách sử dụng hàm
from pprint import pprint

class Obj:
    __slots__ = 'foo', 'bar', '__dict__'
    def __init__(self, baz):
        self.foo = ''
        self.bar = 0
        self.baz = baz
    @property
    def quux(self):
        return self.foo * self.bar

obj = Obj('baz')
pprint(vars(obj))
8 để in các thuộc tính của đối tượng:

from pprint import pprint

mylist = list()
pprint(dir(mylist))

Output:

from pprint import pprint

class Obj:
    __slots__ = 'foo', 'bar', '__dict__'
    def __init__(self, baz):
        self.foo = ''
        self.bar = 0
        self.baz = baz
    @property
    def quux(self):
        return self.foo * self.bar

obj = Obj('baz')
pprint(vars(obj))
0

In các thuộc tính của một đối tượng trong Python bằng hàm from pprint import pprint class Obj: __slots__ = 'foo', 'bar', '__dict__' def __init__(self, baz): self.foo = '' self.bar = 0 self.baz = baz @property def quux(self): return self.foo * self.bar obj = Obj('baz') pprint(vars(obj)) 9 trong Python

Các hàm

from pprint import pprint

class Obj:
    __slots__ = 'foo', 'bar', '__dict__'
    def __init__(self, baz):
        self.foo = ''
        self.bar = 0
        self.baz = baz
    @property
    def quux(self):
        return self.foo * self.bar

obj = Obj('baz')
pprint(vars(obj))
9, khi được gọi không có đối số, trả về từ điển với bảng ký hiệu cục bộ hiện tại.Nếu một đối tượng được chuyển đến hàm
from pprint import pprint

class Obj:
    __slots__ = 'foo', 'bar', '__dict__'
    def __init__(self, baz):
        self.foo = ''
        self.bar = 0
        self.baz = baz
    @property
    def quux(self):
        return self.foo * self.bar

obj = Obj('baz')
pprint(vars(obj))
9, nó sẽ trả về thuộc tính
from pprint import pprint

class Obj:
    __slots__ = 'foo', 'bar', '__dict__'
    def __init__(self, baz):
        self.foo = ''
        self.bar = 0
        self.baz = baz
    @property
    def quux(self):
        return self.foo * self.bar

obj = Obj('baz')
pprint(vars(obj))
3 của đối tượng.Nếu đối tượng được cung cấp dưới dạng đầu vào không có thuộc tính
from pprint import pprint

class Obj:
    __slots__ = 'foo', 'bar', '__dict__'
    def __init__(self, baz):
        self.foo = ''
        self.bar = 0
        self.baz = baz
    @property
    def quux(self):
        return self.foo * self.bar

obj = Obj('baz')
pprint(vars(obj))
3,
vars(obj)['quux'] = 'WHAT?!'
vars(obj)
6 sẽ được nâng lên.

Ví dụ về mã dưới đây trình bày cách sử dụng hàm

from pprint import pprint

class Obj:
    __slots__ = 'foo', 'bar', '__dict__'
    def __init__(self, baz):
        self.foo = ''
        self.bar = 0
        self.baz = baz
    @property
    def quux(self):
        return self.foo * self.bar

obj = Obj('baz')
pprint(vars(obj))
9 để in các thuộc tính đối tượng trong Python.

from pprint import pprint

class Obj:
    __slots__ = 'foo', 'bar', '__dict__'
    def __init__(self, baz):
        self.foo = ''
        self.bar = 0
        self.baz = baz
    @property
    def quux(self):
        return self.foo * self.bar

obj = Obj('baz')
pprint(vars(obj))
1