Python: Bir üst sınıftan nasıl alt sınıf oluştururum?


86

Python'da, bir üst sınıftan nasıl alt sınıf yaratırsınız?


3
Python'un alt sınıflandırma yapma şeklinizi değiştirdiğine dikkat edin, bu nedenle bunu yapmanın 2 yolu vardır ve bunlar karıştırılmaz. Karıştırırsanız bir hata alırsınız. Farkı görmek için bu
yazıyı

Yanıtlar:


90
# 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__()

6
OTOH, bazı insanlar superözellikle yeni Python programcıları için (örneğin, Lutz) karşı uyarıyor . Bundan kaçınırım.
eric

7
Kaçınmanız gereken tek neden , Python'da nasıl çalıştığı ile diğer dillerde nasıl / çalıştığı arasındaki superfarkları 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. supersuperparent
TheAtomicOption


65

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()

37
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


5
Daha __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)
dbr

2
Bence soru, daha fazla kod eklenebileceğini varsayacak kadar belirsizdi. Yeterli olmamaktansa çok fazla bilgi sağlamak ve OP uyguladığında başka bir soruyla sonuçlanmak daha iyidir. :)
Matt Dewey

15
class Class1(object):
    pass

class Class2(Class1):
    pass

Sınıf2, Sınıf1'in bir alt sınıfıdır


Güzel. Aslında aradığım şey buydu, yani süper için hiçbir uzantısı / geçersiz kılmaya sahip olmayan bir alt sınıf.
BuvinJ

10

Yukarıdaki cevaplarda, superherhangi 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, listbaşlatıldığında, reverseanahtar 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 ).


4

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.





1
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())

5
Ne işe yaradığına dair bir açıklama eklerseniz bu cevap daha faydalı olacaktır
grooveplex

4
Bu kod sorunu çözmeye yardımcı olsa da soruyu neden ve / veya nasıl yanıtladığını açıklamaz. Bu ek bağlamın sağlanması, uzun vadeli eğitim değerini önemli ölçüde artıracaktır. Hangi sınırlamalar ve varsayımların geçerli olduğu dahil açıklama eklemek için lütfen yanıtınızı düzenleyin .
Toby Speight

2
Bu kod parçacığı soruyu çözebilirken, bir açıklama eklemek, yayınınızın kalitesini artırmaya gerçekten yardımcı olur. Gelecekte okuyucular için soruyu yanıtlayacağınızı ve bu kişilerin kod önerinizin nedenlerini bilmeyebileceklerini unutmayın.
andreas

0

Python'da alt sınıflandırma şu şekilde yapılır:

class WindowElement:
    def print(self):
        pass

class Button(WindowElement):
    def print(self):
        pass

İşte Python hakkında sınıfları ve alt sınıfları da içeren bir öğretici .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.