-
-
Notifications
You must be signed in to change notification settings - Fork 409
Open
Description
Same context here
The following runs fine:
from abc import ABC, abstractmethod
import attr
class A(ABC):
@abstractmethod
def prop(self):
pass
def foo(self):
print(self.prop())
class B:
def prop(self):
return 5
class C(B, A):
pass
C()
Here, C has a function prop inherited from B which is found first in the MRO order so A wouldn't complain about its existence. I tried this with a dataclass as well:
from abc import ABC, abstractmethod
from dataclasses import dataclass, field
class A(ABC):
@property
@abstractmethod
def prop(self):
pass
def foo(self):
print(self.prop())
@dataclass
class B:
prop: int = field(default=5)
class C(B, A):
pass
C()
However, this doesn't work with attr:
from abc import ABC, abstractmethod
import attr
@attr.s
class A(ABC):
@property
@abstractmethod
def prop(self):
pass
def foo(self):
print(self.prop())
@attr.s
class B:
prop: int = attr.ib(default=5)
@attr.s
class C(B, A):
pass
C()
Running it:
❯ python test.py
Traceback (most recent call last):
File "test_mro_abstract_property.py", line 22, in <module>
C()
TypeError: Can't instantiate abstract class C with abstract methods prop
Python version: 3.8.3, attrs version 22.1.0
Metadata
Metadata
Assignees
Labels
No labels