新建一个 python 的 package,在 package 中创建了一个 Animal.py 的文件,并在 Animal.py 文件中定义了一个 Animal 的类;
------Animal.py------- class Animal: def __init__(self, name=None): self.name = name def introduce(self): pass
与此同时在 package 下面,创建了 Dog.py,Cat.py,分别在文件中定义了 Dog,Cat 子类(均继承 Animal),并实现了 introduce 方法
-----Dog.py-------- from animal.animal import Animal class Dog(Animal): def introduce(self): print("i am a dog") ----Cat.py------ from animal.animal import Animal class Cat(Animal): def introduce(self): print("i am a cat")
![]() | 1 gwy15 2021-01-15 18:59:19 +08:00 Animal.__subclasses__() |
![]() | 3 BBrother 2021-01-15 19:12:26 +08:00 __subclasses__ +1 复杂一点的可以用元类: https://www.verybin.com/?886efe270afffde5#3fG4Lzpe9+QiIhqC4U4y0QJyHXYXddwchnFraPMULAk= |
5 RickyHao 2021-01-15 19:26:11 +08:00 via Android 你不 import,那这代码就相当于不存在吧? 实在不行,规定个文件夹,启动的时候自动 import 文件夹下的所有代码文件 |
6 xchaoinfo 2021-01-15 19:29:22 +08:00 via Android 不引入,不实例化,ast 了解下 |
![]() | 7 maocat 2021-01-15 19:29:43 +08:00 via Android |
8 dwadewyp OP |
10 dwadewyp OP |
![]() | 11 maocat 2021-01-16 17:25:19 +08:00 via Android |
12 tmackan 2021-01-16 18:24:58 +08:00 @xchaoinfo 专业 @dwadewyp py 中有个 inspect 的反射包,但是看了下文档,没办法满足你的需求 https://www.cnblogs.com/yaohong/p/8874154.html |
14 dwadewyp OP 已解决: 在 animal __init__.py ``` import os import pkgutil pkgpath = os.path.dirname(__file__) pkgname = os.path.basename(pkgpath) for _, file, _ in pkgutil.iter_modules([pkgpath]): __import__(pkgname+'.'+file) ``` |
15 julyclyde 2021-01-18 14:21:20 +08:00 安装包的时候注册 entrypoint,然后 init 阶段遍历加载 |