| 710 | |
| 711 | |
| 712 | class ClassStubsGenerator(StubsGenerator): |
| 713 | ATTRIBUTES_BLACKLIST = ( |
| 714 | "__class__", |
| 715 | "__module__", |
| 716 | "__qualname__", |
| 717 | "__dict__", |
| 718 | "__weakref__", |
| 719 | "__annotations__", |
| 720 | ) |
| 721 | PYBIND11_ATTRIBUTES_BLACKLIST = ("__entries",) |
| 722 | METHODS_BLACKLIST = ("__dir__", "__sizeof__") |
| 723 | BASE_CLASS_BLACKLIST = ("pybind11_object", "object") |
| 724 | CLASS_NAME_BLACKLIST = ("pybind11_type",) |
| 725 | |
| 726 | def __init__( |
| 727 | self, |
| 728 | klass, |
| 729 | attributes_blacklist=ATTRIBUTES_BLACKLIST, |
| 730 | pybind11_attributes_blacklist=PYBIND11_ATTRIBUTES_BLACKLIST, |
| 731 | base_class_blacklist=BASE_CLASS_BLACKLIST, |
| 732 | methods_blacklist=METHODS_BLACKLIST, |
| 733 | class_name_blacklist=CLASS_NAME_BLACKLIST, |
| 734 | ): |
| 735 | self.klass = klass |
| 736 | assert inspect.isclass(klass) |
| 737 | assert klass.__name__.isidentifier() |
| 738 | |
| 739 | self.doc_string = None # type: Optional[str] |
| 740 | |
| 741 | self.classes = [] # type: List[ClassStubsGenerator] |
| 742 | self.fields = [] # type: List[AttributeStubsGenerator] |
| 743 | self.properties = [] # type: List[PropertyStubsGenerator] |
| 744 | self.methods = [] # type: List[ClassMemberStubsGenerator] |
| 745 | self.alias = [] |
| 746 | |
| 747 | self.base_classes = [] |
| 748 | self.involved_modules_names = set() # Set[str] |
| 749 | |
| 750 | self.attributes_blacklist = attributes_blacklist |
| 751 | self.pybind11_attributes_blacklist = pybind11_attributes_blacklist |
| 752 | self.base_class_blacklist = base_class_blacklist |
| 753 | self.methods_blacklist = methods_blacklist |
| 754 | self.class_name_blacklist = class_name_blacklist |
| 755 | |
| 756 | def get_involved_modules_names(self): |
| 757 | return self.involved_modules_names |
| 758 | |
| 759 | def parse(self): |
| 760 | if self.klass in _visited_objects: |
| 761 | return |
| 762 | _visited_objects.append(self.klass) |
| 763 | |
| 764 | bases = inspect.getmro(self.klass)[1:] |
| 765 | |
| 766 | def is_base_member(name, member): |
| 767 | for base in bases: |
| 768 | if hasattr(base, name) and getattr(base, name) is member: |
| 769 | return True |