2017-05-17 17 views
9

Xin chào Tôi có phần bên dưới mà từ đó tôi đang cố gắng lấy dữ liệu từ Outlook bằng cách sử dụng mã thu được trên StackOverflow.Liệt kê tất cả các thuộc tính được kế thừa bởi một lớp

Sử dụng vòng lặp đầu tiên, tôi đang cố thu thập tất cả các thuộc tính có sẵn cho đối tượng.

Trong khi chạy nó, tôi nhận thấy sự vắng mặt của Tên mà sau này được gọi trong vòng 2, tôi cho rằng điều này là do thừa kế. Xin vui lòng bạn có thể giúp tôi trong việc tìm kiếm tất cả các thuộc tính có sẵn cho một lớp học?

import win32com.client,sys 

o = win32com.client.gencache.EnsureDispatch("Outlook.Application") 
ns = o.GetNamespace("MAPI") 

adrLi = ns.AddressLists.Item("Global Address List") 
contacts = adrLi.AddressEntries 
numEntries = adrLi.AddressEntries.Count 
print(type(contacts)) 
nameAliasDict = {} 
attrs_ = dir(contacts) 
for i in range(len(attrs_)): 
    print((attrs_[i])) 

for j in contacts: 
    print(j.Name) 

    sys.exit() 
+0

http://stackoverflow.com/questions/4241171/inspect-python-class-attributes thuộc tính đối tượng ghi chú có thể khác nhau – Serge

+1

Không nhất thiết phải thừa kế; tập hợp các tên mà tra cứu thuộc tính thành công không nhất thiết phải được xác định rõ ràng. Điều duy nhất bạn có thể nói chắc chắn là thuộc tính 'x' có sẵn cho' foo' nếu 'foo.x' không tăng' AttributeError'. – chepner

Trả lời

3

Sử dụng các chức năng được tích hợp sẵn superdir.

super là trường hợp của lớp mẹ.

Trả về đối tượng proxy ủy quyền cuộc gọi phương thức cho loại cha hoặc anh chị em. Điều này rất hữu ích cho việc truy cập các phương thức kế thừa đã được ghi đè trong một lớp.

dir trả về danh sách thuộc tính của đối số.

Với đối số, cố gắng trả về danh sách thuộc tính hợp lệ cho đối tượng đó.

class Foo: 
    def __init__(self): 
     self.v = 10 

class Bar(Foo): 
    def __init__(self): 
     super().__init__() 
     print(dir(super())) 

b = Bar() 

Output:

[(...), 'v'] 

Danh sách đầu ra chứa tất cả các thuộc tính được định nghĩa trong lớp mẹ. Nó chủ yếu chứa các thuộc tính được kế thừa từ object (các thuộc tính giữa dấu gạch dưới kép).


Nếu bạn không mở rộng các lớp mà bạn muốn biết các thuộc tính, chỉ cần sử dụng dir trên một ví dụ:

>>> dir(Foo()) 
['__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__', '__str__', '__subclasshook__', '__weakref__', 'v'] 
+0

'dir (super())' không làm những gì bạn nghĩ. Ví dụ, nếu 'v' được định nghĩa trong' Bar' thay vì 'Foo', nó sẽ vẫn hiển thị trong đầu ra. Ngoài ra, 'dir (super())' sẽ không hiển thị các phương thức kế thừa, hoặc bất kỳ phương thức nào của đối tượng; các phương thức được hiển thị bởi 'dir (super())' là một danh sách hoàn toàn không liên quan, đến từ phân cấp lớp của chính 'super'. – user2357112

4

dir(contacts) sẽ cho bạn thấy tất cả các tên thuộc tính của contacts.

tôi nhận thấy sự vắng mặt của danh mà sau này được gọi là trong vòng 2

Bạn sử dụng j.Name không contacts.Name vì vậy không có lý do cho Name xuất hiện từ vòng đầu tiên. Nếu bạn muốn biết tất cả các thuộc tính có sẵn trên j thì hãy thực hiện dir(j).

1

Với hai lớp, phụ huynh và trẻ em, nếu bạn muốn chỉ các thuộc tính kế thừa bạn có thể sử dụng inspect mô-đun kết hợp với dir:

import inspect 

class Parent(): 
    a = 1 

    def myfunc(self): 
     return 2 

class Child(Parent): 

    c = 4 


mros = inspect.getmro(Child) #returns a tuple with the class in parameter at the first position, the rest should be the parent class(es) 
child_attrs = dir(mros[0]) 
parent_attrs = dir(mros[1]) 

inherited_attr = [item for item in child_attrs if item in parent_attrs] 

print(parent_attrs) 
print(child_attrs) 
print(inherited_attr) 

Và bạn có thể đi như thế này lên thành hệ thống phân cấp tuy nhiên bạn muốn

5

Python cung cấp một nội trang nhỏ tiện dụng gọi là dir.Tôi có thể sử dụng nó trên một cá thể lớp để lấy danh sách tất cả các thuộc tính và phương thức của lớp đó cùng với một số phương pháp ma thuật được thừa hưởng, chẳng hạn như __delattr__,__dict__, __doc__, __format__, v.v. Bạn có thể tự mình thử làm như sau:

x = dir(myClassInstance) 

nhưng những gì bạn muốn là:

child.__class__.__bases__[0]().getAttributes() 

__bases__ là một thuộc tính lớp chứa tuple của lớp cơ sở cho lớp này. vì vậy nếu lớp của bạn chỉ có một lớp cơ sở, thì đây là câu trả lời, nhưng nếu lớp có nhiều hơn một lớp cơ sở, chỉ cần làm tương tự cho tất cả các phần tử từ bộ dữ liệu đó.

+1

Phương thức 'getAttributes()' đến từ đâu? –

Các vấn đề liên quan