Assume I have below Mixin class, and it assumes the class inherits it has property value. However, PyLance is not happy with this code given self.value is not defined in foo_mixin
class foo_mixin:
def f1(self, a:int) -> int:
return self.value + a
def f2(self, a:int) -> int:
return self.f1(a) - a
Then I tried to type hint 'self' with some protocol, like below:
from typing import Protocol
class value_protocol(Protocol):
@property
def value(self) -> int: ...
And foo can is now defined as below:
class foo_mixin:
def f1(self:value_protocol, a:int) -> int:
return self.value + a
def f2(self:value_protocol, a:int) -> int:
return self.value * self.f1(a) - a
But value_protocol does not contain f1, so Pylance now is angry with me about f1 by saying
Cannot access member "f1" for type "value_protocol".
Member "f1" is unknown Pylance
My question is how should I type hint self in this case.
Make foo_mixin
an ABC
, with value
an abstractproperty
:
from abc import ABC, abstractproperty
class foo_mixin(ABC):
@abstractproperty
def value(self) -> int: ...
def f1(self, a:int) -> int:
return self.value + a
def f2(self, a:int) -> int:
return self.value * self.f1(a) - a
Now any concrete class which inherits foo_mixin
is required to implement value
, which makes it safe for any instance of foo_mixin
to access self.value
.
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.