Temel (süper) sınıfı nasıl başlatırım?
class SuperClass(object):
def __init__(self, x):
self.x = x
class SubClass(SuperClass):
def __init__(self, y):
self.y = y
super
Yöntem çözümleme sırasında sonraki yöntemi (bağlı yöntem olarak) aldığınızdan emin olmak için bir nesne kullanın . Python 2'de, self
bağlı __init__
yöntemi aramak için sınıf adını iletmeniz ve süper yapmanız gerekir :
class SubClass(SuperClass):
def __init__(self, y):
super(SubClass, self).__init__('x')
self.y = y
Python 3'te, argümanları super
gereksiz kılan küçük bir sihir var - ve bir yan fayda olarak biraz daha hızlı çalışıyor:
class SubClass(SuperClass):
def __init__(self, y):
super().__init__('x')
self.y = y
Ebeveyni aşağıdaki gibi sabit kodlamak, işbirlikçi çoklu kalıtımı kullanmanızı engeller:
class SubClass(SuperClass):
def __init__(self, y):
SuperClass.__init__(self, 'x') # don't do this
self.y = y
__init__
Yalnızca geri dönebileceğiniNone
unutmayın - nesneyi yerinde değiştirmek için tasarlanmıştır.
bir şey __new__
Örnekleri başlatmanın başka bir yolu var - ve Python'daki değişmez türlerin alt sınıfları için tek yol bu. Eğer alt sınıfa istiyorsanız gerekli olduğunu str
veya tuple
veya başka değişmez bir nesne.
Örtük bir sınıf argümanı aldığı için bunun bir sınıf yöntemi olduğunu düşünebilirsiniz. Ama aslında statik bir yöntem . Yani çağırmanız gerekir __new__
ile cls
açıkça.
Örneği genellikle adresinden döndürürüz __new__
, bu yüzden eğer yaparsanız, __new__
üssünüzün super
yanı sıra temel sınıfınızda da aramanız gerekir . Yani her iki yöntemi de kullanırsanız:
class SuperClass(object):
def __new__(cls, x):
return super(SuperClass, cls).__new__(cls)
def __init__(self, x):
self.x = x
class SubClass(object):
def __new__(cls, y):
return super(SubClass, cls).__new__(cls)
def __init__(self, y):
self.y = y
super(SubClass, self).__init__('x')
Python 3 __new__
, statik bir yöntem olmasının neden olduğu süper çağrıların tuhaflığından biraz kaçıyor , ancak yine de cls
bağlı olmayan __new__
yönteme geçmeniz gerekiyor :
class SuperClass(object):
def __new__(cls, x):
return super().__new__(cls)
def __init__(self, x):
self.x = x
class SubClass(object):
def __new__(cls, y):
return super().__new__(cls)
def __init__(self, y):
self.y = y
super().__init__('x')