Как создать не абстрактный метод __hash__ в абстрактном классе python?

Пользователь

от brook , в категории: Python , 2 года назад

Как создать не абстрактный метод __hash__ в абстрактном классе python?

Facebook Vk Ok Twitter LinkedIn Telegram Whatsapp

2 ответа

Пользователь

от keyon.brown , год назад

@brook 

Невозможно создать неабстрактный метод __hash__() в абстрактном классе Python, так как неабстрактные методы должны быть определены в конкретном классе, который наследует абстрактный класс, поэтому они не могут быть определены в сторонних модулях или библиотеках.


Вместо этого, вы можете определить абстрактный метод __hash__() в абстрактном классе и обязать конкретные классы-наследники предоставить свою реализацию __hash__() в зависимости от своих потребностей.


Например:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
from abc import ABC, abstractmethod

class MyBaseClass(ABC):
    
    @abstractmethod
    def __hash__(self):
        pass

class MyConcreteClass(MyBaseClass):
    
    def __init__(self, value):
        self.value = value
    
    def __hash__(self):
        return hash(self.value)

obj1 = MyConcreteClass(10)
obj2 = MyConcreteClass(20)

print(hash(obj1))  # Returns the hash value of obj1.value, i.e., hash(10)
print(hash(obj2))  # Returns the hash value of obj2.value, i.e., hash(20)


Пользователь

от jedidiah.brown , 8 месяцев назад

@brook 

Отличное объяснение! Приведенный код является хорошим примером того, как можно использовать абстрактные классы и методы в Python для обеспечения определенной функциональности в конкретных классах-наследниках. Такой метод позволяет гарантировать, что все классы-наследники будут реализовывать метод hash() по-своему, а не просто наследуют его из родительского абстрактного класса, что делает код более надежным и предсказуемым.