Diğer cevaplarda açıklandığı gibi, evet Python'daki soyut sınıfları abc
modülü kullanarak kullanabilirsiniz . Ben soyut kullanarak gerçek bir örnek vermek Aşağıda @classmethod
, @property
ve @abstractmethod
(3.6+ Python kullanarak). Benim için kolayca kopyalayıp yapıştırabileceğim örneklerle başlamak genellikle daha kolaydır; Umarım bu cevap başkaları için de yararlıdır.
İlk olarak şu temel sınıfı oluşturalım Base
:
from abc import ABC, abstractmethod
class Base(ABC):
@classmethod
@abstractmethod
def from_dict(cls, d):
pass
@property
@abstractmethod
def prop1(self):
pass
@property
@abstractmethod
def prop2(self):
pass
@prop2.setter
@abstractmethod
def prop2(self, val):
pass
@abstractmethod
def do_stuff(self):
pass
Bizim Base
sınıf her zaman olacaktır from_dict
classmethod
, bir property
prop1
(salt okunur olan) ve bir property
prop2
(aynı zamanda kümesi olabilir) adında bir işlevi yanı sıra do_stuff
. Şimdi ne tür bir sınıf inşa edildiyse, Base
tüm bunları yöntemler / özellikler için uygulamak zorunda kalacaktır. Bir yöntemin soyut olması için iki dekoratörün gerekli olduğunu classmethod
ve soyut olduğunu lütfen unutmayın property
.
Şimdi böyle bir sınıf oluşturabiliriz A
:
class A(Base):
def __init__(self, name, val1, val2):
self.name = name
self.__val1 = val1
self._val2 = val2
@classmethod
def from_dict(cls, d):
name = d['name']
val1 = d['val1']
val2 = d['val2']
return cls(name, val1, val2)
@property
def prop1(self):
return self.__val1
@property
def prop2(self):
return self._val2
@prop2.setter
def prop2(self, value):
self._val2 = value
def do_stuff(self):
print('juhu!')
def i_am_not_abstract(self):
print('I can be customized')
Gerekli tüm yöntemler / özellikler uygulanır ve elbette - parçası olmayan ek işlevler de ekleyebiliriz Base
(burada:) i_am_not_abstract
.
Şimdi yapabiliriz:
a1 = A('dummy', 10, 'stuff')
a2 = A.from_dict({'name': 'from_d', 'val1': 20, 'val2': 'stuff'})
a1.prop1
# prints 10
a1.prop2
# prints 'stuff'
İstediğiniz gibi ayarlayamayız prop1
:
a.prop1 = 100
dönecek
AttributeError: özellik ayarlanamıyor
Ayrıca from_dict
yöntemimiz iyi çalışıyor:
a2.prop1
# prints 20
Şimdi B
böyle bir ikinci sınıf tanımlamışsak :
class B(Base):
def __init__(self, name):
self.name = name
@property
def prop1(self):
return self.name
ve böyle bir nesneyi somutlaştırmaya çalıştı:
b = B('iwillfail')
bir hata alacağız
TypeError: do_stuff, from_dict, prop2 soyut yöntemleriyle soyut B sınıfı somutlaştırılamaz
tanımlanan her şeyi listeleme Base
biz uygulamak vermedi hangi B
.