Python'da, bir üst sınıftan nasıl alt sınıf yaratırsınız?
Python'da, bir üst sınıftan nasıl alt sınıf yaratırsınız?
Yanıtlar:
# Initialize using Parent
#
class MySubClass(MySuperClass):
def __init__(self):
MySuperClass.__init__(self)
Ya da daha da iyisi, Python'un yerleşik işlevinin kullanımı super()
(bunun için Python 2 / Python 3 belgelerine bakın), başlangıç için ebeveyni aramak için biraz daha iyi bir yöntem olabilir:
# Better initialize using Parent (less redundant).
#
class MySubClassBetter(MySuperClass):
def __init__(self):
super(MySubClassBetter, self).__init__()
Veya, sıfır bağımsız değişken biçiminin kullanılması haricinde, yukarıdakiyle aynı şey super()
, yalnızca bir sınıf tanımı içinde çalışır:
class MySubClassBetter(MySuperClass):
def __init__(self):
super().__init__()
super
özellikle yeni Python programcıları için (örneğin, Lutz) karşı uyarıyor . Bundan kaçınırım.
super
farkları anlamamanızdır . Kuşkusuz bu, diğer dillerden gelen insanlar için açık değildir, ancak bunun "dikkat edilmesi gereken" bir şey olduğu sonucuna varamam. O does işi. Sadece farklı çalışıyor. Beklemediğiniz sonuçları almaktan şikayet etmeden önce Python'da gerçekte ne yaptığını okuyun. super
super
parent
Küçük, kahramanca bir örnek:
class SuperHero(object): #superclass, inherits from default object
def getName(self):
raise NotImplementedError #you want to override this on the child classes
class SuperMan(SuperHero): #subclass, inherits from SuperHero
def getName(self):
return "Clark Kent"
class SuperManII(SuperHero): #another subclass
def getName(self):
return "Clark Kent, Jr."
if __name__ == "__main__":
sm = SuperMan()
print sm.getName()
sm2 = SuperManII()
print sm2.getName()
class MySubClass(MySuperClass):
def __init__(self):
MySuperClass.__init__(self)
# <the rest of your custom initialization code goes here>
Miras bölüm piton belgelerinde daha ayrıntılı olarak açıklıyor
__init__
fazla kod eklemek istiyorsanız, yalnızca bu yöntemi tanımlamanız gerekir , aksi takdirde yine de orijinal init yöntemi kullanılır (bahsetmeye değer ve tamamen geçerli bir kod olmasına rağmen)
Yukarıdaki cevaplarda, super
herhangi bir (anahtar kelime) argüman olmadan başlatılmıştır. Bununla birlikte, genellikle bunu yapmak ve kendi 'özel' argümanlarınızı iletmek istersiniz. İşte bu kullanım durumunu gösteren bir örnek:
class SortedList(list):
def __init__(self, *args, reverse=False, **kwargs):
super().__init__(*args, **kwargs) # Initialize the super class
self.reverse = reverse
self.sort(reverse=self.reverse) # Do additional things with the custom keyword arguments
Bu, aşağıdaki testlerin de gösterdiği gibi, list
başlatıldığında, reverse
anahtar kelime argümanı tarafından belirtilen yönde kendisini hemen sıralayan bir alt sınıftır:
import pytest
def test_1():
assert SortedList([5, 2, 3]) == [2, 3, 5]
def test_2():
SortedList([5, 2, 3], reverse=True) == [5, 3, 2]
def test_3():
with pytest.raises(TypeError):
sorted_list = SortedList([5, 2, 3], True) # This doesn't work because 'reverse' must be passed as a keyword argument
if __name__ == "__main__":
pytest.main([__file__])
On geçmesiyle sayesinde *args
üzere super
, liste başlatıldı ve bunun yerine yalnızca boş olma eşyalarla doldurulur olabilir. (Bunun PEP 3102'yereverse
göre sadece anahtar kelime argümanı olduğuna dikkat edin ).
Python'da alt sınıfları dinamik olarak bir işlevle yapmanın başka bir yolu vardır type()
:
SubClass = type('SubClass', (BaseClass,), {'set_x': set_x}) # Methods can be set, including __init__()
Metasınıflarla çalışırken genellikle bu yöntemi kullanmak istersiniz. Daha düşük seviyeli otomasyonlar yapmak istediğinizde, bu python'un sınıfı yaratma şeklini değiştirir. Büyük olasılıkla bunu bu şekilde yapmanız gerekmeyecektir, ancak yaptığınız zaman, ne yaptığınızı zaten bileceksiniz.
Kullan:
class DerivedClassName(BaseClassName):
Ayrıntılar için Python belgeleri, bölüm 9.5'e bakın .
class Mammal(object):
#mammal stuff
class Dog(Mammal):
#doggie stuff
class BankAccount:
def __init__(self, balance=0):
self.balance = int(balance)
def checkBalance(self): ## Checking opening balance....
return self.balance
def deposit(self, deposit_amount=1000): ## takes in cash deposit amount and updates the balance accordingly.
self.deposit_amount = deposit_amount
self.balance += deposit_amount
return self.balance
def withdraw(self, withdraw_amount=500): ## takes in cash withdrawal amount and updates the balance accordingly
if self.balance < withdraw_amount: ## if amount is greater than balance return `"invalid transaction"`
return 'invalid transaction'
else:
self.balance -= withdraw_amount
return self.balance
class MinimumBalanceAccount(BankAccount): #subclass MinimumBalanceAccount of the BankAccount class
def __init__(self,balance=0, minimum_balance=500):
BankAccount.__init__(self, balance=0)
self.minimum_balance = minimum_balance
self.balance = balance - minimum_balance
#print "Subclass MinimumBalanceAccount of the BankAccount class created!"
def MinimumBalance(self):
return self.minimum_balance
c = BankAccount()
print(c.deposit(50))
print(c.withdraw(10))
b = MinimumBalanceAccount(100, 50)
print(b.deposit(50))
print(b.withdraw(10))
print(b.MinimumBalance())