Hướng dẫn in python 3 or higher if no class is inherited it implicitly inherits the object class - trong python 3 hoặc cao hơn nếu không có lớp nào được kế thừa thì nó sẽ kế thừa lớp đối tượng một cách ngầm định

Có bất kỳ lý do cho một tuyên bố lớp để kế thừa từ class ClassicSpam: pass 6?

Trong Python 3, ngoài khả năng tương thích giữa Python 2 và 3, không có lý do. Trong Python 2, nhiều lý do.


Python 2.x Story:

Trong Python 2.x (từ 2.2 trở đi) có hai kiểu lớp tùy thuộc vào sự hiện diện hoặc vắng mặt của

class ClassicSpam:
    pass
6 như một lớp cơ sở:

  1. Các lớp kiểu "cổ điển": Họ không có

    class ClassicSpam:
        pass
    
    6 làm lớp cơ sở: classes: they don't have
    class ClassicSpam:
        pass
    
    6 as a base class:

    >>> class ClassicSpam:      # no base class
    ...     pass
    >>> ClassicSpam.__bases__
    ()
    
  2. Các lớp kiểu "mới": Họ có, trực tiếp hoặc gián tiếp (ví dụ: kế thừa từ loại tích hợp),

    class ClassicSpam:
        pass
    
    6 dưới dạng lớp cơ sở: classes: they have, directly or indirectly (e.g inherit from a built-in type),
    class ClassicSpam:
        pass
    
    6 as a base class:

    >>> class NewSpam(object):           # directly inherit from object
    ...    pass
    >>> NewSpam.__bases__
    (<type 'object'>,)
    >>> class IntSpam(int):              # indirectly inherit from object...
    ...    pass
    >>> IntSpam.__bases__
    (<type 'int'>,) 
    >>> IntSpam.__bases__[0].__bases__   # ... because int inherits from object  
    (<type 'object'>,)
    

Không còn nghi ngờ gì nữa, khi viết một lớp học, bạn sẽ luôn muốn tham gia các lớp học kiểu mới. Các đặc quyền của việc làm như vậy là rất nhiều, để liệt kê một số trong số chúng:

  • Hỗ trợ cho các mô tả. Cụ thể, các cấu trúc sau được thực hiện với các mô tả:

    1. class NewSpam(object):
           pass
      
      0: Một phương thức nhận lớp như một đối số ngầm thay vì thể hiện.
    2. class NewSpam(object):
           pass
      
      1: Một phương thức không nhận được đối số ngầm
      class NewSpam(object):
           pass
      
      2 làm đối số đầu tiên.
    3. Các thuộc tính có
      class NewSpam(object):
           pass
      
      3: Tạo các chức năng để quản lý việc nhận, cài đặt và xóa thuộc tính.
    4. class NewSpam(object):
           pass
      
      4: Lưu các thỏa thuận bộ nhớ của một lớp và cũng dẫn đến quyền truy cập thuộc tính nhanh hơn. Tất nhiên, nó áp đặt những hạn chế.
  • Phương thức tĩnh

    class NewSpam(object):
         pass
    
    5: Cho phép bạn tùy chỉnh cách tạo các phiên bản lớp mới.

  • Thứ tự phân giải phương thức (MRO): Theo thứ tự nào các lớp cơ sở của một lớp sẽ được tìm kiếm khi cố gắng giải quyết phương thức nào để gọi.

  • Liên quan đến MRO,

    class NewSpam(object):
         pass
    
    6 cuộc gọi. Cũng xem,
    class NewSpam(object):
         pass
    
    7 được coi là siêu.

Nếu bạn không thừa kế từ

class ClassicSpam:
    pass
6, hãy quên những thứ này. Một mô tả đầy đủ hơn về các điểm đạn trước cùng với các đặc quyền khác của các lớp kiểu "mới" có thể được tìm thấy ở đây.

Một trong những nhược điểm của các lớp kiểu mới là bản thân lớp học đòi hỏi nhiều hơn. Tuy nhiên, trừ khi bạn tạo ra nhiều đối tượng lớp, tôi nghi ngờ đây sẽ là một vấn đề và đó là một vụ chìm tiêu cực trong một biển tích cực.


Python 3.x Story:

Trong Python 3, mọi thứ được đơn giản hóa. Chỉ các lớp kiểu mới tồn tại (được gọi rõ ràng là các lớp) vì vậy, sự khác biệt duy nhất trong việc thêm

class ClassicSpam:
    pass
6 là yêu cầu bạn gõ thêm 8 ký tự. Đây:

class ClassicSpam:
    pass

hoàn toàn tương đương (ngoài tên của họ :-) với điều này:

class NewSpam(object):
     pass

Và về điều này:

class Spam():
    pass

Tất cả đều có

class ClassicSpam:
    pass
6 trong
class Spam():
    pass
1 của họ.

>>> [object in cls.__bases__ for cls in {Spam, NewSpam, ClassicSpam}]
[True, True, True]

Vậy bạn nên làm gì?

Trong Python 2: Luôn thừa kế từ

class ClassicSpam:
    pass
6 một cách rõ ràng. Nhận các đặc quyền. always inherit from
class ClassicSpam:
    pass
6 explicitly. Get the perks.

Trong Python 3: kế thừa từ

class ClassicSpam:
    pass
6 nếu bạn đang viết mã cố gắng trở thành Python Agnostic, nghĩa là, nó cần phải hoạt động cả trong Python 2 và trong Python 3. Nếu không, nó thực sự không có sự khác biệt vì Python chèn nó cho nó bạn đằng sau hậu trường. inherit from
class ClassicSpam:
    pass
6 if you are writing code that tries to be Python agnostic, that is, it needs to work both in Python 2 and in Python 3. Otherwise don't, it really makes no difference since Python inserts it for you behind the scenes.

Giới thiệu

Lập trình hướng đối tượng tạo ra các mẫu mã có thể tái sử dụng để hạn chế dự phòng trong các dự án phát triển. Một cách mà lập trình hướng đối tượng đạt được mã có thể tái chế là thông qua kế thừa, khi một lớp con có thể tận dụng mã từ một lớp cơ sở khác.

Hướng dẫn này sẽ trải qua một số khía cạnh chính của thừa kế trong Python, bao gồm cách các lớp cha và lớp con hoạt động, cách ghi đè các phương thức và thuộc tính, cách sử dụng hàm

class NewSpam(object):
     pass
7 và cách sử dụng nhiều kế thừa.

Điều kiện tiên quyết

Bạn nên cài đặt Python 3 và môi trường lập trình được thiết lập trên máy tính hoặc máy chủ của bạn. Nếu bạn không có môi trường lập trình được thiết lập, bạn có thể tham khảo hướng dẫn cài đặt và thiết lập cho môi trường lập trình cục bộ hoặc cho môi trường lập trình trên máy chủ của bạn phù hợp với hệ điều hành của bạn (Ubuntu, Centos, Debian, v.v.)

Thừa kế là gì?

Kế thừa là khi một lớp sử dụng mã được xây dựng trong một lớp khác. Nếu chúng ta nghĩ về sự kế thừa về mặt sinh học, chúng ta có thể nghĩ về một đứa trẻ thừa hưởng những đặc điểm nhất định từ cha mẹ của chúng. Đó là, một đứa trẻ có thể thừa hưởng chiều cao hoặc màu mắt của cha mẹ. Trẻ em cũng có thể chia sẻ cùng họ với cha mẹ của chúng. is when a class uses code constructed within another class. If we think of inheritance in terms of biology, we can think of a child inheriting certain traits from their parent. That is, a child can inherit a parent’s height or eye color. Children also may share the same last name with their parents.

Các lớp được gọi là các lớp con hoặc các lớp con kế thừa các phương thức và biến từ các lớp cha hoặc các lớp cơ sở.child classes or subclasses inherit methods and variables from parent classes or base classes.

Chúng ta có thể nghĩ về một lớp cha mẹ gọi là

class Spam():
    pass
5 có các biến lớp cho
class Spam():
    pass
6,
class Spam():
    pass
7 và
class Spam():
    pass
8 rằng lớp con
class Spam():
    pass
9 sẽ kế thừa từ
class Spam():
    pass
5.

Bởi vì lớp con

class Spam():
    pass
9 được kế thừa từ lớp cơ sở
class Spam():
    pass
5, lớp
class Spam():
    pass
9 có thể sử dụng lại mã của
class Spam():
    pass
5, cho phép lập trình viên sử dụng ít dòng mã hơn và giảm dự phòng.

Lớp phụ huynh

Các lớp cha mẹ hoặc cơ sở tạo ra một mẫu trong đó con hoặc các lớp con có thể dựa trên. Các lớp mẹ cho phép chúng tôi tạo các lớp con thông qua kế thừa mà không phải viết lại mã tương tự mỗi lần. Bất kỳ lớp nào cũng có thể được thực hiện thành một lớp cha mẹ, vì vậy chúng là mỗi lớp đầy đủ chức năng theo cách riêng của họ, thay vì chỉ các mẫu.

Hãy nói rằng chúng tôi có một lớp phụ huynh

>>> [object in cls.__bases__ for cls in {Spam, NewSpam, ClassicSpam}]
[True, True, True]
5 nói chung có các lớp con
>>> [object in cls.__bases__ for cls in {Spam, NewSpam, ClassicSpam}]
[True, True, True]
6 và
>>> [object in cls.__bases__ for cls in {Spam, NewSpam, ClassicSpam}]
[True, True, True]
7. Nhiều phương pháp giữa tài khoản cá nhân và doanh nghiệp sẽ tương tự nhau, chẳng hạn như các phương thức rút và gửi tiền, vì vậy chúng có thể thuộc loại phụ huynh của
>>> [object in cls.__bases__ for cls in {Spam, NewSpam, ClassicSpam}]
[True, True, True]
5. Lớp con
>>> [object in cls.__bases__ for cls in {Spam, NewSpam, ClassicSpam}]
[True, True, True]
7 sẽ có các phương pháp cụ thể cho nó, bao gồm cả cách thu thập hồ sơ và biểu mẫu kinh doanh, cũng như biến
class Fish:
    def __init__(self, first_name, last_name="Fish"):
        self.first_name = first_name
        self.last_name = last_name
0.

Tương tự, một lớp

class Fish:
    def __init__(self, first_name, last_name="Fish"):
        self.first_name = first_name
        self.last_name = last_name
1 có thể có các phương pháp
class Fish:
    def __init__(self, first_name, last_name="Fish"):
        self.first_name = first_name
        self.last_name = last_name
2 và
class Fish:
    def __init__(self, first_name, last_name="Fish"):
        self.first_name = first_name
        self.last_name = last_name
3 và phân lớp
class Fish:
    def __init__(self, first_name, last_name="Fish"):
        self.first_name = first_name
        self.last_name = last_name
4 có thể bao gồm các phương thức
class Fish:
    def __init__(self, first_name, last_name="Fish"):
        self.first_name = first_name
        self.last_name = last_name
5 và ____66 cụ thể của riêng nó.

Hãy cùng tạo ra một lớp phụ huynh

class Fish:
    def __init__(self, first_name, last_name="Fish"):
        self.first_name = first_name
        self.last_name = last_name
7 mà sau này chúng ta sẽ sử dụng để xây dựng các loại cá làm các lớp con của nó. Mỗi con cá này sẽ có tên và tên cuối cùng ngoài các đặc điểm.

Thông tin: Để làm theo cùng với mã ví dụ trong hướng dẫn này, hãy mở một vỏ tương tác Python trên hệ thống cục bộ của bạn bằng cách chạy lệnh

class Fish:
    def __init__(self, first_name, last_name="Fish"):
        self.first_name = first_name
        self.last_name = last_name
8. Sau đó, bạn có thể sao chép, dán hoặc chỉnh sửa các ví dụ bằng cách thêm chúng sau dấu nhắc
class Fish:
    def __init__(self, first_name, last_name="Fish"):
        self.first_name = first_name
        self.last_name = last_name
9.
To follow along with the example code in this tutorial, open a Python interactive shell on your local system by running the
class Fish:
    def __init__(self, first_name, last_name="Fish"):
        self.first_name = first_name
        self.last_name = last_name
8 command. Then you can copy, paste, or edit the examples by adding them after the
class Fish:
    def __init__(self, first_name, last_name="Fish"):
        self.first_name = first_name
        self.last_name = last_name
9 prompt.

Chúng tôi sẽ tạo một tệp mới có tên

class Fish:
    def __init__(self, first_name, last_name="Fish"):
        self.first_name = first_name
        self.last_name = last_name

    def swim(self):
        print("The fish is swimming.")

    def swim_backwards(self):
        print("The fish can swim backwards.")
0 và bắt đầu với phương thức trình xây dựng
class Fish:
    def __init__(self, first_name, last_name="Fish"):
        self.first_name = first_name
        self.last_name = last_name

    def swim(self):
        print("The fish is swimming.")

    def swim_backwards(self):
        print("The fish can swim backwards.")
1, mà chúng tôi sẽ cư trú với các biến lớp
class Fish:
    def __init__(self, first_name, last_name="Fish"):
        self.first_name = first_name
        self.last_name = last_name

    def swim(self):
        print("The fish is swimming.")

    def swim_backwards(self):
        print("The fish can swim backwards.")
2 và
class Spam():
    pass
6 cho mỗi đối tượng hoặc lớp con
class Fish:
    def __init__(self, first_name, last_name="Fish"):
        self.first_name = first_name
        self.last_name = last_name
7.

fish.py

class Fish:
    def __init__(self, first_name, last_name="Fish"):
        self.first_name = first_name
        self.last_name = last_name

Chúng tôi đã khởi tạo biến

class Spam():
    pass
6 của chúng tôi với chuỗi
class Fish:
    def __init__(self, first_name, last_name="Fish"):
        self.first_name = first_name
        self.last_name = last_name

    def swim(self):
        print("The fish is swimming.")

    def swim_backwards(self):
        print("The fish can swim backwards.")
6 vì chúng tôi biết rằng hầu hết các loài cá sẽ có tên này là tên cuối cùng của chúng.

Hãy để thêm một số phương pháp khác:

Cá.py

class Fish:
    def __init__(self, first_name, last_name="Fish"):
        self.first_name = first_name
        self.last_name = last_name

    def swim(self):
        print("The fish is swimming.")

    def swim_backwards(self):
        print("The fish can swim backwards.")

Chúng tôi đã thêm các phương thức

class Fish:
    def __init__(self, first_name, last_name="Fish"):
        self.first_name = first_name
        self.last_name = last_name

    def swim(self):
        print("The fish is swimming.")

    def swim_backwards(self):
        print("The fish can swim backwards.")
7 và
class Fish:
    def __init__(self, first_name, last_name="Fish"):
        self.first_name = first_name
        self.last_name = last_name

    def swim(self):
        print("The fish is swimming.")

    def swim_backwards(self):
        print("The fish can swim backwards.")
8 vào lớp
class Fish:
    def __init__(self, first_name, last_name="Fish"):
        self.first_name = first_name
        self.last_name = last_name
7, để mọi lớp con cũng có thể sử dụng các phương pháp này.

Vì hầu hết các loài cá chúng ta sẽ tạo ra được coi là cá xương (vì trong chúng có một bộ xương được làm từ xương) thay vì cá sụn (như trong chúng có một bộ xương được làm từ sụn), chúng ta có thể thêm một vài Nhiều thuộc tính hơn cho phương thức

class Fish:
    def __init__(self, first_name, last_name="Fish"):
        self.first_name = first_name
        self.last_name = last_name

    def swim(self):
        print("The fish is swimming.")

    def swim_backwards(self):
        print("The fish can swim backwards.")
1:

fish.py

class Fish:
    def __init__(self, first_name, last_name="Fish",
                 skeleton="bone", eyelids=False):
        self.first_name = first_name
        self.last_name = last_name
        self.skeleton = skeleton
        self.eyelids = eyelids

    def swim(self):
        print("The fish is swimming.")

    def swim_backwards(self):
        print("The fish can swim backwards.")

Xây dựng một lớp cha theo phương pháp tương tự như xây dựng bất kỳ lớp nào khác, ngoại trừ chúng tôi đang suy nghĩ về những phương pháp mà các lớp con sẽ có thể sử dụng một khi chúng tôi tạo ra chúng.

Lớp trẻ em

Trẻ em hoặc các lớp con là các lớp sẽ kế thừa từ lớp cha. Điều đó có nghĩa là mỗi lớp trẻ sẽ có thể sử dụng các phương thức và biến của lớp cha.

Ví dụ: một lớp con

class Fish:
    def __init__(self, first_name, last_name="Fish",
                 skeleton="bone", eyelids=False):
        self.first_name = first_name
        self.last_name = last_name
        self.skeleton = skeleton
        self.eyelids = eyelids

    def swim(self):
        print("The fish is swimming.")

    def swim_backwards(self):
        print("The fish can swim backwards.")
1 phân lớp lớp
class Fish:
    def __init__(self, first_name, last_name="Fish"):
        self.first_name = first_name
        self.last_name = last_name
7 sẽ có thể sử dụng phương pháp
class Fish:
    def __init__(self, first_name, last_name="Fish"):
        self.first_name = first_name
        self.last_name = last_name

    def swim(self):
        print("The fish is swimming.")

    def swim_backwards(self):
        print("The fish can swim backwards.")
7 được khai báo trong
class Fish:
    def __init__(self, first_name, last_name="Fish"):
        self.first_name = first_name
        self.last_name = last_name
7 mà không cần phải khai báo.

Chúng ta có thể nghĩ về từng lớp trẻ là một lớp của lớp cha. Đó là, nếu chúng ta có một lớp con được gọi là

class Fish:
    def __init__(self, first_name, last_name="Fish",
                 skeleton="bone", eyelids=False):
        self.first_name = first_name
        self.last_name = last_name
        self.skeleton = skeleton
        self.eyelids = eyelids

    def swim(self):
        print("The fish is swimming.")

    def swim_backwards(self):
        print("The fish can swim backwards.")
5 và một lớp cha mẹ gọi là
class Fish:
    def __init__(self, first_name, last_name="Fish",
                 skeleton="bone", eyelids=False):
        self.first_name = first_name
        self.last_name = last_name
        self.skeleton = skeleton
        self.eyelids = eyelids

    def swim(self):
        print("The fish is swimming.")

    def swim_backwards(self):
        print("The fish can swim backwards.")
6, chúng ta có thể nói rằng
class Fish:
    def __init__(self, first_name, last_name="Fish",
                 skeleton="bone", eyelids=False):
        self.first_name = first_name
        self.last_name = last_name
        self.skeleton = skeleton
        self.eyelids = eyelids

    def swim(self):
        print("The fish is swimming.")

    def swim_backwards(self):
        print("The fish can swim backwards.")
5 là
class Fish:
    def __init__(self, first_name, last_name="Fish",
                 skeleton="bone", eyelids=False):
        self.first_name = first_name
        self.last_name = last_name
        self.skeleton = skeleton
        self.eyelids = eyelids

    def swim(self):
        print("The fish is swimming.")

    def swim_backwards(self):
        print("The fish can swim backwards.")
6, giống như
class Fish:
    def __init__(self, first_name, last_name="Fish",
                 skeleton="bone", eyelids=False):
        self.first_name = first_name
        self.last_name = last_name
        self.skeleton = skeleton
        self.eyelids = eyelids

    def swim(self):
        print("The fish is swimming.")

    def swim_backwards(self):
        print("The fish can swim backwards.")
1 là
class Fish:
    def __init__(self, first_name, last_name="Fish"):
        self.first_name = first_name
        self.last_name = last_name
7.is a
class Fish:
    def __init__(self, first_name, last_name="Fish",
                 skeleton="bone", eyelids=False):
        self.first_name = first_name
        self.last_name = last_name
        self.skeleton = skeleton
        self.eyelids = eyelids

    def swim(self):
        print("The fish is swimming.")

    def swim_backwards(self):
        print("The fish can swim backwards.")
6, just as a
class Fish:
    def __init__(self, first_name, last_name="Fish",
                 skeleton="bone", eyelids=False):
        self.first_name = first_name
        self.last_name = last_name
        self.skeleton = skeleton
        self.eyelids = eyelids

    def swim(self):
        print("The fish is swimming.")

    def swim_backwards(self):
        print("The fish can swim backwards.")
1 is a
class Fish:
    def __init__(self, first_name, last_name="Fish"):
        self.first_name = first_name
        self.last_name = last_name
7.

Dòng đầu tiên của một lớp trẻ em trông hơi khác so với các lớp không phải con vì bạn phải chuyển lớp cha vào lớp con dưới dạng tham số:

class Trout(Fish):

Lớp

class Trout(Fish):
1 là một đứa trẻ của lớp
class Fish:
    def __init__(self, first_name, last_name="Fish"):
        self.first_name = first_name
        self.last_name = last_name
7. Chúng tôi biết điều này vì sự bao gồm của từ
class Fish:
    def __init__(self, first_name, last_name="Fish"):
        self.first_name = first_name
        self.last_name = last_name
7 trong ngoặc đơn.

Với các lớp con, chúng ta có thể chọn thêm nhiều phương thức hơn, ghi đè các phương thức cha mẹ hiện có hoặc chấp nhận các phương thức cha mẹ mặc định với từ khóa

class Trout(Fish):
4 mà chúng tôi sẽ làm trong trường hợp này:

fish.py

>>> class NewSpam(object):           # directly inherit from object
...    pass
>>> NewSpam.__bases__
(<type 'object'>,)
>>> class IntSpam(int):              # indirectly inherit from object...
...    pass
>>> IntSpam.__bases__
(<type 'int'>,) 
>>> IntSpam.__bases__[0].__bases__   # ... because int inherits from object  
(<type 'object'>,)
0

Bây giờ chúng ta có thể tạo một đối tượng

class Trout(Fish):
1 mà không phải xác định bất kỳ phương thức bổ sung nào.

fish.py

>>> class NewSpam(object):           # directly inherit from object
...    pass
>>> NewSpam.__bases__
(<type 'object'>,)
>>> class IntSpam(int):              # indirectly inherit from object...
...    pass
>>> IntSpam.__bases__
(<type 'int'>,) 
>>> IntSpam.__bases__[0].__bases__   # ... because int inherits from object  
(<type 'object'>,)
1

Chúng tôi đã tạo một đối tượng

class Trout(Fish):
1
class Trout(Fish):
7 sử dụng từng phương pháp của lớp
class Fish:
    def __init__(self, first_name, last_name="Fish"):
        self.first_name = first_name
        self.last_name = last_name
7 mặc dù chúng tôi không xác định các phương thức đó trong lớp trẻ
class Trout(Fish):
1. Chúng tôi chỉ cần chuyển giá trị của
>>> class NewSpam(object):           # directly inherit from object
...    pass
>>> NewSpam.__bases__
(<type 'object'>,)
>>> class IntSpam(int):              # indirectly inherit from object...
...    pass
>>> IntSpam.__bases__
(<type 'int'>,) 
>>> IntSpam.__bases__[0].__bases__   # ... because int inherits from object  
(<type 'object'>,)
00 cho biến
class Fish:
    def __init__(self, first_name, last_name="Fish"):
        self.first_name = first_name
        self.last_name = last_name

    def swim(self):
        print("The fish is swimming.")

    def swim_backwards(self):
        print("The fish can swim backwards.")
2 vì tất cả các biến khác đã được khởi tạo.

Khi chúng tôi chạy chương trình, chúng tôi sẽ nhận được đầu ra sau:

>>> class NewSpam(object):           # directly inherit from object
...    pass
>>> NewSpam.__bases__
(<type 'object'>,)
>>> class IntSpam(int):              # indirectly inherit from object...
...    pass
>>> IntSpam.__bases__
(<type 'int'>,) 
>>> IntSpam.__bases__[0].__bases__   # ... because int inherits from object  
(<type 'object'>,)
2

Tiếp theo, hãy để Lôi tạo một lớp trẻ khác bao gồm phương pháp riêng của nó. Chúng tôi sẽ gọi lớp này

>>> class NewSpam(object):           # directly inherit from object
...    pass
>>> NewSpam.__bases__
(<type 'object'>,)
>>> class IntSpam(int):              # indirectly inherit from object...
...    pass
>>> IntSpam.__bases__
(<type 'int'>,) 
>>> IntSpam.__bases__[0].__bases__   # ... because int inherits from object  
(<type 'object'>,)
02 và phương pháp đặc biệt của nó sẽ cho phép nó sống với hải quỳ biển:

fish.py

>>> class NewSpam(object):           # directly inherit from object
...    pass
>>> NewSpam.__bases__
(<type 'object'>,)
>>> class IntSpam(int):              # indirectly inherit from object...
...    pass
>>> IntSpam.__bases__
(<type 'int'>,) 
>>> IntSpam.__bases__[0].__bases__   # ... because int inherits from object  
(<type 'object'>,)
3

Tiếp theo, hãy để Lôi tạo một đối tượng

>>> class NewSpam(object):           # directly inherit from object
...    pass
>>> NewSpam.__bases__
(<type 'object'>,)
>>> class IntSpam(int):              # indirectly inherit from object...
...    pass
>>> IntSpam.__bases__
(<type 'int'>,) 
>>> IntSpam.__bases__[0].__bases__   # ... because int inherits from object  
(<type 'object'>,)
02 để xem cách thức hoạt động của nó:

fish.py

>>> class NewSpam(object):           # directly inherit from object
...    pass
>>> NewSpam.__bases__
(<type 'object'>,)
>>> class IntSpam(int):              # indirectly inherit from object...
...    pass
>>> IntSpam.__bases__
(<type 'int'>,) 
>>> IntSpam.__bases__[0].__bases__   # ... because int inherits from object  
(<type 'object'>,)
4

Khi chúng tôi chạy chương trình, chúng tôi sẽ nhận được đầu ra sau:

>>> class NewSpam(object):           # directly inherit from object
...    pass
>>> NewSpam.__bases__
(<type 'object'>,)
>>> class IntSpam(int):              # indirectly inherit from object...
...    pass
>>> IntSpam.__bases__
(<type 'int'>,) 
>>> IntSpam.__bases__[0].__bases__   # ... because int inherits from object  
(<type 'object'>,)
5

Tiếp theo, hãy để Lôi tạo một lớp trẻ khác bao gồm phương pháp riêng của nó. Chúng tôi sẽ gọi lớp này

>>> class NewSpam(object):           # directly inherit from object
...    pass
>>> NewSpam.__bases__
(<type 'object'>,)
>>> class IntSpam(int):              # indirectly inherit from object...
...    pass
>>> IntSpam.__bases__
(<type 'int'>,) 
>>> IntSpam.__bases__[0].__bases__   # ... because int inherits from object  
(<type 'object'>,)
02 và phương pháp đặc biệt của nó sẽ cho phép nó sống với hải quỳ biển:

Tiếp theo, hãy để Lôi tạo một đối tượng

>>> class NewSpam(object):           # directly inherit from object
...    pass
>>> NewSpam.__bases__
(<type 'object'>,)
>>> class IntSpam(int):              # indirectly inherit from object...
...    pass
>>> IntSpam.__bases__
(<type 'int'>,) 
>>> IntSpam.__bases__[0].__bases__   # ... because int inherits from object  
(<type 'object'>,)
02 để xem cách thức hoạt động của nó:

>>> class NewSpam(object):           # directly inherit from object
...    pass
>>> NewSpam.__bases__
(<type 'object'>,)
>>> class IntSpam(int):              # indirectly inherit from object...
...    pass
>>> IntSpam.__bases__
(<type 'int'>,) 
>>> IntSpam.__bases__[0].__bases__   # ... because int inherits from object  
(<type 'object'>,)
6

Đầu ra cho thấy đối tượng ____102

>>> class NewSpam(object):           # directly inherit from object
...    pass
>>> NewSpam.__bases__
(<type 'object'>,)
>>> class IntSpam(int):              # indirectly inherit from object...
...    pass
>>> IntSpam.__bases__
(<type 'int'>,) 
>>> IntSpam.__bases__[0].__bases__   # ... because int inherits from object  
(<type 'object'>,)
05 có thể sử dụng các phương thức
class Fish:
    def __init__(self, first_name, last_name="Fish"):
        self.first_name = first_name
        self.last_name = last_name
7
class Fish:
    def __init__(self, first_name, last_name="Fish"):
        self.first_name = first_name
        self.last_name = last_name

    def swim(self):
        print("The fish is swimming.")

    def swim_backwards(self):
        print("The fish can swim backwards.")
1 và
class Fish:
    def __init__(self, first_name, last_name="Fish"):
        self.first_name = first_name
        self.last_name = last_name

    def swim(self):
        print("The fish is swimming.")

    def swim_backwards(self):
        print("The fish can swim backwards.")
7 cũng như phương pháp lớp con của nó là
>>> class NewSpam(object):           # directly inherit from object
...    pass
>>> NewSpam.__bases__
(<type 'object'>,)
>>> class IntSpam(int):              # indirectly inherit from object...
...    pass
>>> IntSpam.__bases__
(<type 'int'>,) 
>>> IntSpam.__bases__[0].__bases__   # ... because int inherits from object  
(<type 'object'>,)
09.

Nếu chúng ta cố gắng sử dụng phương thức

>>> class NewSpam(object):           # directly inherit from object
...    pass
>>> NewSpam.__bases__
(<type 'object'>,)
>>> class IntSpam(int):              # indirectly inherit from object...
...    pass
>>> IntSpam.__bases__
(<type 'int'>,) 
>>> IntSpam.__bases__[0].__bases__   # ... because int inherits from object  
(<type 'object'>,)
09 trong đối tượng
class Trout(Fish):
1, chúng ta sẽ nhận được lỗi:

Điều này là do phương pháp >>> class NewSpam(object): # directly inherit from object ... pass >>> NewSpam.__bases__ (<type 'object'>,) >>> class IntSpam(int): # indirectly inherit from object... ... pass >>> IntSpam.__bases__ (<type 'int'>,) >>> IntSpam.__bases__[0].__bases__ # ... because int inherits from object (<type 'object'>,) 09 chỉ thuộc về lớp con >>> class NewSpam(object): # directly inherit from object ... pass >>> NewSpam.__bases__ (<type 'object'>,) >>> class IntSpam(int): # indirectly inherit from object... ... pass >>> IntSpam.__bases__ (<type 'int'>,) >>> IntSpam.__bases__[0].__bases__ # ... because int inherits from object (<type 'object'>,) 02 chứ không phải lớp phụ huynh class Fish: def __init__(self, first_name, last_name="Fish"): self.first_name = first_name self.last_name = last_name 7.

Các lớp con kế thừa các phương pháp của lớp cha mà nó thuộc về, vì vậy mỗi lớp con có thể sử dụng các phương pháp đó trong các chương trình.override them.

Ghi đè các phương thức cha mẹ

Cho đến nay, chúng tôi đã xem xét lớp con

class Trout(Fish):
1 đã sử dụng từ khóa
class Trout(Fish):
4 để kế thừa tất cả các hành vi của lớp phụ huynh
class Fish:
    def __init__(self, first_name, last_name="Fish"):
        self.first_name = first_name
        self.last_name = last_name
7 và một lớp con khác
>>> class NewSpam(object):           # directly inherit from object
...    pass
>>> NewSpam.__bases__
(<type 'object'>,)
>>> class IntSpam(int):              # indirectly inherit from object...
...    pass
>>> IntSpam.__bases__
(<type 'int'>,) 
>>> IntSpam.__bases__[0].__bases__   # ... because int inherits from object  
(<type 'object'>,)
02 kế thừa tất cả các hành vi của lớp cha và cũng tạo ra phương pháp duy nhất của riêng mình đó là cụ thể cho lớp trẻ. Tuy nhiên, đôi khi, chúng tôi sẽ muốn sử dụng một số hành vi của lớp cha nhưng không phải tất cả chúng. Khi chúng tôi thay đổi các phương thức lớp cha, chúng tôi ghi đè chúng.

Khi xây dựng các lớp cha mẹ và con cái, điều quan trọng là phải ghi nhớ thiết kế chương trình để việc ghi đè không tạo ra mã không cần thiết hoặc dự phòng.

Theo điều này, chúng tôi sẽ ghi đè phương thức xây dựng

class Fish:
    def __init__(self, first_name, last_name="Fish"):
        self.first_name = first_name
        self.last_name = last_name

    def swim(self):
        print("The fish is swimming.")

    def swim_backwards(self):
        print("The fish can swim backwards.")
1 và phương thức
class Fish:
    def __init__(self, first_name, last_name="Fish"):
        self.first_name = first_name
        self.last_name = last_name

    def swim(self):
        print("The fish is swimming.")

    def swim_backwards(self):
        print("The fish can swim backwards.")
8. Chúng tôi không cần phải sửa đổi phương pháp
class Fish:
    def __init__(self, first_name, last_name="Fish"):
        self.first_name = first_name
        self.last_name = last_name

    def swim(self):
        print("The fish is swimming.")

    def swim_backwards(self):
        print("The fish can swim backwards.")
7 vì cá mập là cá có thể bơi. Hãy để xem lại lớp trẻ em này:

fish.py

>>> class NewSpam(object):           # directly inherit from object
...    pass
>>> NewSpam.__bases__
(<type 'object'>,)
>>> class IntSpam(int):              # indirectly inherit from object...
...    pass
>>> IntSpam.__bases__
(<type 'int'>,) 
>>> IntSpam.__bases__[0].__bases__   # ... because int inherits from object  
(<type 'object'>,)
7

Chúng tôi đã ghi đè các tham số được khởi tạo trong phương thức

class Fish:
    def __init__(self, first_name, last_name="Fish"):
        self.first_name = first_name
        self.last_name = last_name

    def swim(self):
        print("The fish is swimming.")

    def swim_backwards(self):
        print("The fish can swim backwards.")
1, do đó biến
class Spam():
    pass
6 hiện được đặt bằng chuỗi
>>> class NewSpam(object):           # directly inherit from object
...    pass
>>> NewSpam.__bases__
(<type 'object'>,)
>>> class IntSpam(int):              # indirectly inherit from object...
...    pass
>>> IntSpam.__bases__
(<type 'int'>,) 
>>> IntSpam.__bases__[0].__bases__   # ... because int inherits from object  
(<type 'object'>,)
28, biến
>>> class NewSpam(object):           # directly inherit from object
...    pass
>>> NewSpam.__bases__
(<type 'object'>,)
>>> class IntSpam(int):              # indirectly inherit from object...
...    pass
>>> IntSpam.__bases__
(<type 'int'>,) 
>>> IntSpam.__bases__[0].__bases__   # ... because int inherits from object  
(<type 'object'>,)
29 hiện được đặt bằng chuỗi
>>> class NewSpam(object):           # directly inherit from object
...    pass
>>> NewSpam.__bases__
(<type 'object'>,)
>>> class IntSpam(int):              # indirectly inherit from object...
...    pass
>>> IntSpam.__bases__
(<type 'int'>,) 
>>> IntSpam.__bases__[0].__bases__   # ... because int inherits from object  
(<type 'object'>,)
30 và biến
>>> class NewSpam(object):           # directly inherit from object
...    pass
>>> NewSpam.__bases__
(<type 'object'>,)
>>> class IntSpam(int):              # indirectly inherit from object...
...    pass
>>> IntSpam.__bases__
(<type 'int'>,) 
>>> IntSpam.__bases__[0].__bases__   # ... because int inherits from object  
(<type 'object'>,)
31 hiện được đặt thành giá trị bolean ____. Mỗi phiên bản của lớp cũng có thể ghi đè các tham số này.

Phương pháp

class Fish:
    def __init__(self, first_name, last_name="Fish"):
        self.first_name = first_name
        self.last_name = last_name

    def swim(self):
        print("The fish is swimming.")

    def swim_backwards(self):
        print("The fish can swim backwards.")
8 hiện in một chuỗi khác so với lớp trong lớp cha mẹ
class Fish:
    def __init__(self, first_name, last_name="Fish"):
        self.first_name = first_name
        self.last_name = last_name
7 vì cá mập không thể bơi ngược theo cách mà cá xương có thể.

Bây giờ chúng ta có thể tạo một thể hiện của lớp con

>>> class NewSpam(object):           # directly inherit from object
...    pass
>>> NewSpam.__bases__
(<type 'object'>,)
>>> class IntSpam(int):              # indirectly inherit from object...
...    pass
>>> IntSpam.__bases__
(<type 'int'>,) 
>>> IntSpam.__bases__[0].__bases__   # ... because int inherits from object  
(<type 'object'>,)
19, vẫn sẽ sử dụng phương pháp
class Fish:
    def __init__(self, first_name, last_name="Fish"):
        self.first_name = first_name
        self.last_name = last_name

    def swim(self):
        print("The fish is swimming.")

    def swim_backwards(self):
        print("The fish can swim backwards.")
7 của lớp phụ huynh
class Fish:
    def __init__(self, first_name, last_name="Fish"):
        self.first_name = first_name
        self.last_name = last_name
7:

fish.py

>>> class NewSpam(object):           # directly inherit from object
...    pass
>>> NewSpam.__bases__
(<type 'object'>,)
>>> class IntSpam(int):              # indirectly inherit from object...
...    pass
>>> IntSpam.__bases__
(<type 'int'>,) 
>>> IntSpam.__bases__[0].__bases__   # ... because int inherits from object  
(<type 'object'>,)
8

Khi chúng tôi chạy mã này, chúng tôi sẽ nhận được đầu ra sau:

>>> class NewSpam(object):           # directly inherit from object
...    pass
>>> NewSpam.__bases__
(<type 'object'>,)
>>> class IntSpam(int):              # indirectly inherit from object...
...    pass
>>> IntSpam.__bases__
(<type 'int'>,) 
>>> IntSpam.__bases__[0].__bases__   # ... because int inherits from object  
(<type 'object'>,)
9

Lớp con

>>> class NewSpam(object):           # directly inherit from object
...    pass
>>> NewSpam.__bases__
(<type 'object'>,)
>>> class IntSpam(int):              # indirectly inherit from object...
...    pass
>>> IntSpam.__bases__
(<type 'int'>,) 
>>> IntSpam.__bases__[0].__bases__   # ... because int inherits from object  
(<type 'object'>,)
19 đã vượt qua thành công các phương thức
class Fish:
    def __init__(self, first_name, last_name="Fish"):
        self.first_name = first_name
        self.last_name = last_name

    def swim(self):
        print("The fish is swimming.")

    def swim_backwards(self):
        print("The fish can swim backwards.")
1 và
class Fish:
    def __init__(self, first_name, last_name="Fish"):
        self.first_name = first_name
        self.last_name = last_name

    def swim(self):
        print("The fish is swimming.")

    def swim_backwards(self):
        print("The fish can swim backwards.")
8 của lớp cha
class Fish:
    def __init__(self, first_name, last_name="Fish"):
        self.first_name = first_name
        self.last_name = last_name
7, đồng thời kế thừa phương thức
class Fish:
    def __init__(self, first_name, last_name="Fish"):
        self.first_name = first_name
        self.last_name = last_name

    def swim(self):
        print("The fish is swimming.")

    def swim_backwards(self):
        print("The fish can swim backwards.")
7 của lớp cha.

Khi sẽ có một số lượng hạn chế các lớp con độc đáo hơn các lớp khác, việc ghi đè các phương thức lớp phụ huynh có thể chứng minh là hữu ích.

Hàm class NewSpam(object): pass 7

Với chức năng

class NewSpam(object):
     pass
7, bạn có thể có quyền truy cập vào các phương thức được kế thừa đã được ghi đè trong một đối tượng lớp.

Khi chúng tôi sử dụng hàm

class NewSpam(object):
     pass
7, chúng tôi đang gọi phương thức cha mẹ vào phương thức con để sử dụng nó. Ví dụ: chúng ta có thể muốn ghi đè một khía cạnh của phương thức cha với chức năng nhất định, nhưng sau đó gọi phần còn lại của phương thức cha mẹ gốc để hoàn thành phương thức.

Trong một chương trình học sinh lớp, chúng tôi có thể muốn có một lớp con cho

>>> class NewSpam(object):           # directly inherit from object
...    pass
>>> NewSpam.__bases__
(<type 'object'>,)
>>> class IntSpam(int):              # indirectly inherit from object...
...    pass
>>> IntSpam.__bases__
(<type 'int'>,) 
>>> IntSpam.__bases__[0].__bases__   # ... because int inherits from object  
(<type 'object'>,)
46 kế thừa từ lớp phụ huynh
>>> class NewSpam(object):           # directly inherit from object
...    pass
>>> NewSpam.__bases__
(<type 'object'>,)
>>> class IntSpam(int):              # indirectly inherit from object...
...    pass
>>> IntSpam.__bases__
(<type 'int'>,) 
>>> IntSpam.__bases__[0].__bases__   # ... because int inherits from object  
(<type 'object'>,)
47. Trong lớp con
>>> class NewSpam(object):           # directly inherit from object
...    pass
>>> NewSpam.__bases__
(<type 'object'>,)
>>> class IntSpam(int):              # indirectly inherit from object...
...    pass
>>> IntSpam.__bases__
(<type 'int'>,) 
>>> IntSpam.__bases__[0].__bases__   # ... because int inherits from object  
(<type 'object'>,)
46, chúng tôi có thể muốn ghi đè một phương thức
>>> class NewSpam(object):           # directly inherit from object
...    pass
>>> NewSpam.__bases__
(<type 'object'>,)
>>> class IntSpam(int):              # indirectly inherit from object...
...    pass
>>> IntSpam.__bases__
(<type 'int'>,) 
>>> IntSpam.__bases__[0].__bases__   # ... because int inherits from object  
(<type 'object'>,)
49 của lớp cha để bao gồm chức năng để tính toán một cấp độ, nhưng vẫn giữ phần còn lại của chức năng của lớp ban đầu. Bằng cách gọi chức năng
class NewSpam(object):
     pass
7, chúng tôi sẽ có thể đạt được điều này.

Hàm

class NewSpam(object):
     pass
7 được sử dụng phổ biến nhất trong phương thức
class Fish:
    def __init__(self, first_name, last_name="Fish"):
        self.first_name = first_name
        self.last_name = last_name

    def swim(self):
        print("The fish is swimming.")

    def swim_backwards(self):
        print("The fish can swim backwards.")
1 vì đó là nơi bạn rất có thể cần thêm một số tính độc đáo vào lớp con và sau đó hoàn thành khởi tạo từ cha mẹ.

Để xem cách thức hoạt động của nó, hãy để sửa đổi lớp con

class Trout(Fish):
1 của chúng tôi. Vì cá hồi thường là cá nước ngọt, hãy để thêm một biến
>>> class NewSpam(object):           # directly inherit from object
...    pass
>>> NewSpam.__bases__
(<type 'object'>,)
>>> class IntSpam(int):              # indirectly inherit from object...
...    pass
>>> IntSpam.__bases__
(<type 'int'>,) 
>>> IntSpam.__bases__[0].__bases__   # ... because int inherits from object  
(<type 'object'>,)
54 vào phương pháp
class Fish:
    def __init__(self, first_name, last_name="Fish"):
        self.first_name = first_name
        self.last_name = last_name

    def swim(self):
        print("The fish is swimming.")

    def swim_backwards(self):
        print("The fish can swim backwards.")
1 và đặt nó bằng chuỗi
>>> class NewSpam(object):           # directly inherit from object
...    pass
>>> NewSpam.__bases__
(<type 'object'>,)
>>> class IntSpam(int):              # indirectly inherit from object...
...    pass
>>> IntSpam.__bases__
(<type 'int'>,) 
>>> IntSpam.__bases__[0].__bases__   # ... because int inherits from object  
(<type 'object'>,)
56, nhưng sau đó duy trì phần còn lại của các biến và tham số của lớp cha mẹ::

fish.py

class ClassicSpam:
    pass
0

Chúng tôi đã ghi đè phương thức

class Fish:
    def __init__(self, first_name, last_name="Fish"):
        self.first_name = first_name
        self.last_name = last_name

    def swim(self):
        print("The fish is swimming.")

    def swim_backwards(self):
        print("The fish can swim backwards.")
1 trong lớp con
class Trout(Fish):
1, cung cấp một triển khai khác của
class Fish:
    def __init__(self, first_name, last_name="Fish"):
        self.first_name = first_name
        self.last_name = last_name

    def swim(self):
        print("The fish is swimming.")

    def swim_backwards(self):
        print("The fish can swim backwards.")
1 đã được xác định bởi lớp cha
class Fish:
    def __init__(self, first_name, last_name="Fish"):
        self.first_name = first_name
        self.last_name = last_name
7 của nó. Trong phương thức
class Fish:
    def __init__(self, first_name, last_name="Fish"):
        self.first_name = first_name
        self.last_name = last_name

    def swim(self):
        print("The fish is swimming.")

    def swim_backwards(self):
        print("The fish can swim backwards.")
1 của lớp
class Trout(Fish):
1 của chúng tôi, chúng tôi đã gọi rõ phương pháp
class Fish:
    def __init__(self, first_name, last_name="Fish"):
        self.first_name = first_name
        self.last_name = last_name

    def swim(self):
        print("The fish is swimming.")

    def swim_backwards(self):
        print("The fish can swim backwards.")
1 của lớp
class Fish:
    def __init__(self, first_name, last_name="Fish"):
        self.first_name = first_name
        self.last_name = last_name
7.

Bởi vì chúng tôi đã ghi đè phương thức, chúng tôi không còn cần phải vượt qua

class Fish:
    def __init__(self, first_name, last_name="Fish"):
        self.first_name = first_name
        self.last_name = last_name

    def swim(self):
        print("The fish is swimming.")

    def swim_backwards(self):
        print("The fish can swim backwards.")
2 dưới dạng tham số cho
class Trout(Fish):
1 và nếu chúng tôi vượt qua tham số, chúng tôi sẽ đặt lại
>>> class NewSpam(object):           # directly inherit from object
...    pass
>>> NewSpam.__bases__
(<type 'object'>,)
>>> class IntSpam(int):              # indirectly inherit from object...
...    pass
>>> IntSpam.__bases__
(<type 'int'>,) 
>>> IntSpam.__bases__[0].__bases__   # ... because int inherits from object  
(<type 'object'>,)
67. Do đó, chúng tôi sẽ khởi tạo
class Fish:
    def __init__(self, first_name, last_name="Fish"):
        self.first_name = first_name
        self.last_name = last_name

    def swim(self):
        print("The fish is swimming.")

    def swim_backwards(self):
        print("The fish can swim backwards.")
2 bằng cách gọi biến trong thể hiện đối tượng của chúng tôi.

Bây giờ chúng ta có thể gọi các biến khởi tạo của lớp cha và cũng sử dụng biến con duy nhất. Hãy để sử dụng điều này trong một ví dụ

class Trout(Fish):
1:

fish.py

class ClassicSpam:
    pass
1
class ClassicSpam:
    pass
2

Đầu ra cho thấy đối tượng

class Trout(Fish):
7 của lớp con
class Trout(Fish):
1 có thể sử dụng cả biến
class Fish:
    def __init__(self, first_name, last_name="Fish"):
        self.first_name = first_name
        self.last_name = last_name

    def swim(self):
        print("The fish is swimming.")

    def swim_backwards(self):
        print("The fish can swim backwards.")
1 dành riêng cho trẻ em
>>> class NewSpam(object):           # directly inherit from object
...    pass
>>> NewSpam.__bases__
(<type 'object'>,)
>>> class IntSpam(int):              # indirectly inherit from object...
...    pass
>>> IntSpam.__bases__
(<type 'int'>,) 
>>> IntSpam.__bases__[0].__bases__   # ... because int inherits from object  
(<type 'object'>,)
54 trong khi cũng có thể gọi các biến
class Fish:
    def __init__(self, first_name, last_name="Fish"):
        self.first_name = first_name
        self.last_name = last_name

    def swim(self):
        print("The fish is swimming.")

    def swim_backwards(self):
        print("The fish can swim backwards.")
1 của phụ huynh
class Fish:
    def __init__(self, first_name, last_name="Fish"):
        self.first_name = first_name
        self.last_name = last_name
7
class Fish:
    def __init__(self, first_name, last_name="Fish"):
        self.first_name = first_name
        self.last_name = last_name

    def swim(self):
        print("The fish is swimming.")

    def swim_backwards(self):
        print("The fish can swim backwards.")
2,
class Spam():
    pass
6 và ____.

Hàm Python tích hợp

class NewSpam(object):
     pass
7 cho phép chúng tôi sử dụng các phương thức lớp cha ngay cả khi ghi đè lên các khía cạnh nhất định của các phương thức đó trong các lớp con của chúng tôi.

Nhiều kế thừa

Nhiều kế thừa là khi một lớp có thể kế thừa các thuộc tính và phương thức từ nhiều lớp cha. Điều này có thể cho phép các chương trình giảm dự phòng, nhưng nó cũng có thể giới thiệu một số lượng phức tạp cũng như sự mơ hồ nhất định, vì vậy nó nên được thực hiện với suy nghĩ về thiết kế chương trình tổng thể. is when a class can inherit attributes and methods from more than one parent class. This can allow programs to reduce redundancy, but it can also introduce a certain amount of complexity as well as ambiguity, so it should be done with thought to overall program design.

Để hiển thị cách thức hoạt động của nhiều kế thừa, hãy để Lôi tạo một lớp con

>>> class NewSpam(object):           # directly inherit from object
...    pass
>>> NewSpam.__bases__
(<type 'object'>,)
>>> class IntSpam(int):              # indirectly inherit from object...
...    pass
>>> IntSpam.__bases__
(<type 'int'>,) 
>>> IntSpam.__bases__[0].__bases__   # ... because int inherits from object  
(<type 'object'>,)
80 so với kế thừa từ lớp
>>> class NewSpam(object):           # directly inherit from object
...    pass
>>> NewSpam.__bases__
(<type 'object'>,)
>>> class IntSpam(int):              # indirectly inherit from object...
...    pass
>>> IntSpam.__bases__
(<type 'int'>,) 
>>> IntSpam.__bases__[0].__bases__   # ... because int inherits from object  
(<type 'object'>,)
81 và lớp
>>> class NewSpam(object):           # directly inherit from object
...    pass
>>> NewSpam.__bases__
(<type 'object'>,)
>>> class IntSpam(int):              # indirectly inherit from object...
...    pass
>>> IntSpam.__bases__
(<type 'int'>,) 
>>> IntSpam.__bases__[0].__bases__   # ... because int inherits from object  
(<type 'object'>,)
82. Chúng ta có thể tạo một phương thức trong mỗi và sau đó sử dụng từ khóa
class Trout(Fish):
4 trong lớp con
>>> class NewSpam(object):           # directly inherit from object
...    pass
>>> NewSpam.__bases__
(<type 'object'>,)
>>> class IntSpam(int):              # indirectly inherit from object...
...    pass
>>> IntSpam.__bases__
(<type 'int'>,) 
>>> IntSpam.__bases__[0].__bases__   # ... because int inherits from object  
(<type 'object'>,)
80:

coral_reef.py

class ClassicSpam:
    pass
3

Lớp

>>> class NewSpam(object):           # directly inherit from object
...    pass
>>> NewSpam.__bases__
(<type 'object'>,)
>>> class IntSpam(int):              # indirectly inherit from object...
...    pass
>>> IntSpam.__bases__
(<type 'int'>,) 
>>> IntSpam.__bases__[0].__bases__   # ... because int inherits from object  
(<type 'object'>,)
81 có một phương thức gọi là
>>> class NewSpam(object):           # directly inherit from object
...    pass
>>> NewSpam.__bases__
(<type 'object'>,)
>>> class IntSpam(int):              # indirectly inherit from object...
...    pass
>>> IntSpam.__bases__
(<type 'int'>,) 
>>> IntSpam.__bases__[0].__bases__   # ... because int inherits from object  
(<type 'object'>,)
86 in một dòng và lớp
>>> class NewSpam(object):           # directly inherit from object
...    pass
>>> NewSpam.__bases__
(<type 'object'>,)
>>> class IntSpam(int):              # indirectly inherit from object...
...    pass
>>> IntSpam.__bases__
(<type 'int'>,) 
>>> IntSpam.__bases__[0].__bases__   # ... because int inherits from object  
(<type 'object'>,)
87 có một phương thức gọi là
>>> class NewSpam(object):           # directly inherit from object
...    pass
>>> NewSpam.__bases__
(<type 'object'>,)
>>> class IntSpam(int):              # indirectly inherit from object...
...    pass
>>> IntSpam.__bases__
(<type 'int'>,) 
>>> IntSpam.__bases__[0].__bases__   # ... because int inherits from object  
(<type 'object'>,)
88 in một dòng khác. Sau đó, chúng tôi gọi cả hai lớp vào tuple thừa kế. Điều này có nghĩa là
>>> class NewSpam(object):           # directly inherit from object
...    pass
>>> NewSpam.__bases__
(<type 'object'>,)
>>> class IntSpam(int):              # indirectly inherit from object...
...    pass
>>> IntSpam.__bases__
(<type 'int'>,) 
>>> IntSpam.__bases__[0].__bases__   # ... because int inherits from object  
(<type 'object'>,)
89 đang kế thừa từ hai lớp cha.

Bây giờ hãy khởi tạo một đối tượng

>>> class NewSpam(object):           # directly inherit from object
...    pass
>>> NewSpam.__bases__
(<type 'object'>,)
>>> class IntSpam(int):              # indirectly inherit from object...
...    pass
>>> IntSpam.__bases__
(<type 'int'>,) 
>>> IntSpam.__bases__[0].__bases__   # ... because int inherits from object  
(<type 'object'>,)
89:

coral_reef.py

class ClassicSpam:
    pass
4

Đối tượng

>>> class NewSpam(object):           # directly inherit from object
...    pass
>>> NewSpam.__bases__
(<type 'object'>,)
>>> class IntSpam(int):              # indirectly inherit from object...
...    pass
>>> IntSpam.__bases__
(<type 'int'>,) 
>>> IntSpam.__bases__[0].__bases__   # ... because int inherits from object  
(<type 'object'>,)
91 được đặt thành đối tượng
>>> class NewSpam(object):           # directly inherit from object
...    pass
>>> NewSpam.__bases__
(<type 'object'>,)
>>> class IntSpam(int):              # indirectly inherit from object...
...    pass
>>> IntSpam.__bases__
(<type 'int'>,) 
>>> IntSpam.__bases__[0].__bases__   # ... because int inherits from object  
(<type 'object'>,)
89 và có thể sử dụng các phương thức trong cả hai lớp cha. Khi chúng tôi chạy chương trình, chúng tôi sẽ thấy đầu ra sau:

class ClassicSpam:
    pass
5

Đầu ra cho thấy các phương pháp từ cả hai lớp cha được sử dụng hiệu quả trong lớp con.

Nhiều kế thừa cho phép chúng tôi sử dụng mã từ nhiều lớp cha trong lớp con. Nếu cùng một phương thức được xác định trong nhiều phương thức cha mẹ, lớp con sẽ sử dụng phương thức của cha mẹ đầu tiên được khai báo trong danh sách tuple của nó.

Mặc dù nó có thể được sử dụng một cách hiệu quả, nên nhiều kế thừa nên được thực hiện một cách cẩn thận để các chương trình của chúng tôi không trở nên mơ hồ và khó hiểu đối với các lập trình viên khác.

Sự kết luận

Hướng dẫn này đã trải qua việc xây dựng các lớp cha và các lớp con, ghi đè các phương thức và thuộc tính cha mẹ trong các lớp con, sử dụng hàm

class NewSpam(object):
     pass
7 và cho phép các lớp con được thừa hưởng từ nhiều lớp cha.

Kế thừa trong mã hóa hướng đối tượng có thể cho phép tuân thủ nguyên tắc phát triển phần mềm khô (không lặp lại), cho phép thực hiện nhiều hơn với ít mã và lặp lại. Kế thừa cũng buộc các lập trình viên phải suy nghĩ về cách họ đang thiết kế các chương trình họ đang tạo để đảm bảo rằng mã có hiệu quả và rõ ràng.

Bạn có cần phải thừa hưởng từ đối tượng Python 3?

Bạn không cần phải thừa hưởng từ đối tượng để có phong cách mới trong Python 3. Tất cả các lớp là kiểu mới.Bạn không cần phải, nhưng "Mã Python chuyển đến Python 3" nói rằng nó vẫn còn hiệu lực: docs.python.org/py3k/howto/pyporting.html#subclass-object cũng: docs.python.org/reference/…. All classes are new-style. You don't have to, but the "Porting Python code to Python 3" says that it's still valid: docs.python.org/py3k/howto/pyporting.html#subclass-object Also: docs.python.org/reference/…

Python có ngầm thừa kế lớp đối tượng không?

Đối tượng siêu lớp Điều này là bởi vì mỗi lớp bạn tạo trong Python ngầm xuất phát từ đối tượng.Bạn có thể rõ ràng hơn và viết lớp myClass (đối tượng):, nhưng nó dư thừa và không cần thiết.every class you create in Python implicitly derives from object . You could be more explicit and write class MyClass(object): , but it's redundant and unnecessary.

Các lớp Python có nên kế thừa đối tượng?

Trong trường hợp không có bất kỳ siêu lớp nào khác mà bạn đặc biệt muốn kế thừa, siêu lớp phải luôn luôn là đối tượng, đó là gốc rễ của tất cả các lớp trong Python.the superclass should always be object , which is the root of all classes in Python.

Tất cả các lớp có kế thừa từ đối tượng trong Python không?

Tất cả các lớp trong Python là đối tượng của loại loại và loại loại này được gọi là metaclass.Mỗi lớp trong Python, theo mặc định, kế thừa từ lớp cơ sở đối tượng.Each class in Python, by default, inherits from the object base class.