|
golangLoverNov 7, 2021
1
声明为抽象类
|
|
golangLoverNov 7, 2021
2
看错了,以为是 java 区的。 无视我吧。
|
|
KevinBlandyNov 7, 2021
3
在构造函数中,通过 this 获取到 class 判断。
|
|
4
各位,忘了声明,这个问题是关于 Python 的
|
|
oOoOoOoOoOoNov 7, 2021 via Android
5
@KevinBlandy um, python
|
|
6
|
|
HelloAmadeusNov 7, 2021 via iPhone
7
继承自定义 type 类,type 类在构造的时候判断类名
|
|
chromingNov 7, 2021
8
可以在__init__里用 self.__class__判断当前类
```python class A(object): def __init__(self): if self.__class__ == A: raise ``` |
|
learningmanNov 7, 2021
9
这个类所有的成员里面都放个报错
|
|
10
|
|
ClericPyNov 7, 2021
11
一楼没说错, 面向对象基本都有抽象类. 把抽象方法啥的都 raise 一个 NotImplementedError 就行了, 随便一搜一大把 demo
|
|
KilerdNov 7, 2021
12
import abc
这都没有人用过吗? |
|
ArchieMengNov 8, 2021 via Android
13
还真没用过,因为没这需求
|
|
oOoOoOoOoOoNov 8, 2021 via Android
14
```python
class Finch: ____... ``` |
|
WilliamYangNov 8, 2021
15
用一些新出的内置魔法方法或者元类,应该可以的
|
|
KobayashiNov 8, 2021 via Android
16
这就是 Tornado 的 Configurable 做的事。IOLoop 实例化默认实例化其子类 EPollIOLoop ,KQueueIOLoop 或者 SelectIOLoop 。通过 Configurable.__new__ 里做的修改。
它做的过为复杂,当时应该是在自己实现一套接口(同类型的还有 abc, zope.interface 。 针对你的问题,自己实现简化一下只创建基类、子类,在基类 __new__ 中实现返回子类即可。 |
|
GeruzoniAnsasuNov 8, 2021
17
什么抽象类 拿锤子看钉子属于是
python 的 oo 跟 C 系列很不一样,你想达到的类似效果应该用 metaclass 实现 |
|
MegrezZhuNov 8, 2021
18
|
|
hulala1021Nov 8, 2021
19
12 楼、18 楼说的对
|
|
2i2Re2PLMaDnghLNov 8, 2021
20
最简单的只要在 __new__ 里面判断一下 if cls == MyClass: raise 就行了
#17 猜测 X-Y 问题不无道理,这种操作通常有一些更 Pythonic 的形式。 1. 比如你把这个类取名以下划线开头 _MyClass 2. 鉴于鸭子类型,可能你更应该声明一个 typing.Protocol (类似 golang 的 interface ,按照隐式的实质结构而不是显式的声明继承来判断其所属类) 3. 如果你要做一些通用的高等方法调用依赖于实现的初等方法,那么 abc 确实是比较稳定的,把初等方法搞成 abstractmethod 4. 但其实 abc 是 mixin 的一种特殊形式,还会破坏 metaclass 魔法,你先得确认自己需要的不是更通用的 mixin 。mixin 也是 composition over inheritance 的。 |
|
O5oz6z3Nov 8, 2021
21
#8 楼最简单,硬编码类检查。抽象类需要子类覆盖抽象方法。元类我想不到怎么做,所以我猜用类装饰器给类的__init__包一层检查函数就能简单实现。
|
|
raysonluNov 8, 2021
22
我理解的提议是:不能 new 定义的父类,只能 new 其子类。那就在父类的构造函数直接抛错?(子类不调用父类构造函数)
|
|
shm7Nov 21, 2021
23
的确常用 ABC ,不过实用没啥纠结。
|