Python gọi phương thức ông bà

Hàm super[] cho phép bạn chạy một hàm của lớp cha bên trong lớp con. Siêu phương thức Python trả về một đối tượng proxy ủy quyền các lệnh gọi phương thức cho một loại cha hoặc lớp anh chị em. Nó được sử dụng để truy cập các phương thức kế thừa đã bị ghi đè trong một lớp

Ví dụ siêu phương thức gọi Python

Mã ví dụ đơn giản

class Parent[object]:
    def __init__[self, age]:
        self.age = age

    def func[self]:
        print[f"Hi, my age is {self.age}!"]


class Child[Parent]:
    def __init__[self, age]:
        # use the super to run the parent class __init__ function to set the childs' name
        super[].__init__[age]


dad = Parent[50]
kid = Child[18]

dad.func[]
kid.func[]  # The kid inherits it from the dad, so I could run it like that too

đầu ra

Làm cách nào để gọi phương thức của lớp cha từ lớp con trong Python?

Câu trả lời. Sử dụng hàm super[]. Trả về một đối tượng proxy ủy thác các cuộc gọi phương thức cho một loại cha hoặc anh chị em

class A[object]:
    def foo[self]:
        print ["foo"]


class B[A]:
    def foo[self]:
        super[B, self].foo[]  # calls 'A.foo[]'


myB = B[]
myB.foo[]

đầu ra. foo

Làm thế nào để gọi một siêu phương thức từ lớp cháu?

Câu trả lời. Đây là một ví dụ về việc gọi một siêu phương thức từ lớp cháu

class Grandparent[object]:
    def my_method[self]:
        print["Grandparent"]


class Parent[Grandparent]:
    def my_method[self]:
        print["Parent"]


class Child[Parent]:
    def my_method[self]:
        print["Hello Grandparent"]
        Grandparent.my_method[self]


obj1 = Child[]
obj1.my_method[]

đầu ra

Xin chào ông bà
Ông bà

Hãy bình luận nếu bạn có bất kỳ nghi ngờ hoặc đề xuất nào về hướng dẫn phương pháp Python này

Ghi chú. IDE. PyCharm 2021. 3. 3 [Phiên bản cộng đồng]

cửa sổ 10

Trăn 3. 10. 1

Tất cả các Ví dụ về Python đều nằm trong Python 3, vì vậy có thể nó khác với python 2 hoặc các phiên bản nâng cấp

Rohit

Bằng cấp về Khoa học Máy tính và Kỹ sư. Nhà phát triển ứng dụng và có kinh nghiệm về nhiều ngôn ngữ lập trình. Đam mê công nghệ & thích học hỏi kỹ thuật

Trong phần trước, mình đã đề cập đến các tính chất cơ bản của lớp trong Python. Trong số này, mình sẽ đề cập đến cách tính chất, đặc điểm nâng cao của đẳng cấp

I. Kế thừa nhiều lớp [Multi-inheritance]

Không như Java — ngôn ngữ chỉ cho kế thừa một lớp duy nhất cho một lớp, Python cho phép chúng ta kết hợp nhiều lớp cho một lớp. Ví dụ

class Father:
    pass

class Mother:
    pass

class Child[Father, Mother]:
    pass

Kết quả của con. căn cứ trong trường hợp này đó là

[__main__.Father, __main__.Mother]

II. Tìm thuộc tính với kế thừa

Theo logic, quá trình tìm thuộc tính tìm kiếm như sau

  • Đầu tiên, tìm thuộc tính tìm kiếm trong local dict
  • If not have, continue find in class dict
  • If is not there, find at in the classes at mro

Mình sẽ xác định cuối cùng ở các phần tiếp theo của bài viết

III. MRO

MRO là tên viết tắt của Method Resolution Order. Là một chuỗi kế thừa mà Python tính toán và lưu nó ở thuộc tính MRO trong lớp. Như đã nói ở trên khi tìm thuộc tính, Python sẽ đi lần lượt qua các phần tử trong MRO

Để xem MRO của một class, ta dùng cú pháp ".__mro__". Ví dụ:

class A: pass
class B[A]: pass
class C[B]: pass
class D[C]: pass
class E[D]: pass
E.__mro__

đầu ra

[__main__.E, __main__.D, __main__.C, __main__.B, __main__.A, object]

Python sử dụng đa thừa kế hợp tác để quy định một số luật về thứ tự của lớp

  • Lớp con luôn được kiểm tra trước lớp cha [lớp con luôn được kiểm tra trước lớp cha] Lớp cha [nếu nhiều] luôn được kiểm tra theo thứ tự liệt kê [các lớp cha luôn được tra theo thứ tự được liệt kê]
  • Như ví dụ ở trên, sau khi kiểm tra ở E, lớp D sẽ được kiểm tra vì D được viết đầu tiên trong hai lớp cơ sở. Sau đó, B — lớp phụ huynh của D sẽ được kiểm tra. Cuối cùng, lớp C và cha mẹ của nó - A sẽ được kiểm tra

Để hiểu rõ hơn, các bạn hãy thử không, thử giải thích MRO của lớp E dưới đây

class A: pass
class B: pass
class C[A, B]: pass
class D[B]: pass
class E[C, D]: pass
E.__mro__
[__main__.E, __main__.C, __main__.A, __main__.D, __main__.B, object]

Thuật toán này có tên là "Thuật toán tuyến tính hóa C3" nhưng để đơn giản và dễ nhớ, hãy tưởng tượng các đối tượng đến lối thoát thứ tự khi một sự cố như cháy nhà, chìm tàu ​​xảy ra. "Trẻ em đi trước, sau đó mới là người lớn" [Con cái đi trước, cha mẹ theo sau]

IV. Ví dụ về đa kế thừa

________số 8_______

super[] will call the next class of the current class in MRO

Ví dụ

MRO của NoisyPerson

[__main__.NoisyPerson, __main__.Noisy, __main__.Person, object]

Thử gọi phương thức thảo luận của NoisyPerson instance

girl = NoisyPerson[] girl.talks[]

đầu ra

alo alo

Khi phương thức talk[] của cô gái được gọi, do bản thân NoisyPerson không có phương thức này nên nó sẽ tìm thấy ở lớp tiếp theo trong MRO là Noisy. Phương thức Noisy has talk[] sẽ được thực thi. siêu[]. talk[] will find method talk[] of class next in MRO - Person [return 'alo alo']. Đoạn string 'alo alo' this will be upper[] and return. Kết quả trả về là "ALO ALO"

Bây giờ nếu ta đổi chỗ 2 lớp cha với nhau thì sao?

class NoisyPerson[Person, Noisy]:
    pass

Chạy lại phương thức nói chuyện

[__main__.Father, __main__.Mother]0

đầu ra

[__main__.Father, __main__.Mother]1

This is MRO of NoisyPerson now

[__main__.Father, __main__.Mother]2

Ta thấy class Person được kiểm tra trước Noisy, trong khi đó Person có phương thức talk[] nên nó sẽ được thực thi

Chủ Đề