Hướng dẫn mro is related to in python - mro có liên quan tới trong python
Thứ tự phân giải phương phápMRO là một khái niệm được sử dụng trong kế thừa. Đó là thứ tự mà một phương thức được tìm kiếm trong phân cấp các lớp và đặc biệt hữu ích trong Python vì Python hỗ trợ nhiều phương thức kế thừa được gọi từ một đối tượng con có thể tồn tại trong nhiều lớp siêu. is a concept used in inheritance. It is the order in which a method is searched for in a classes hierarchy and is especially useful in Python because Python supports multiple inheritancea method being called from a child object may exist in multiple super classes. Show Trong Python, MRO nằm từ dưới lên trên và từ trái sang phải. Điều này có nghĩa là, trước tiên, phương thức được tìm kiếm trong lớp của đối tượng. Nếu nó không tìm thấy, nó sẽ được tìm kiếm trong siêu lớp ngay lập tức. Trong trường hợp của nhiều siêu lớp, nó được tìm kiếm từ trái sang phải, theo thứ tự được nhà phát triển tuyên bố. Ví dụ:
Trong trường hợp này, MRO sẽ là C -> B -> A. Vì B được đề cập đầu tiên trong khai báo lớp, nó sẽ được tìm kiếm đầu tiên trong khi giải quyết một phương thức. Hãy cùng xem xét một vài trường hợp, bắt đầu từ đơn giản đến phức tạp. ví dụ 1
Đây là một trường hợp đơn giản với kế thừa duy nhất. Trong trường hợp này, khi Ví dụ 2
MRO cho trường hợp này là: C -> B -> A Phương thức chỉ tồn tại trong A, nơi nó được tìm kiếm cuối cùng. Ví dụ 3
MRO cho điều này có thể là một chút khó khăn. Siêu lớp ngay lập tức cho D là C, vì vậy nếu phương thức không được tìm thấy trong D, thì nó sẽ được tìm kiếm trong C. Tuy nhiên, nếu nó không được tìm thấy trong C, thì bạn phải quyết định xem bạn có nên kiểm tra một (được khai báo đầu tiên trong Danh sách các lớp siêu của C) hoặc kiểm tra B (được khai báo trong danh sách các lớp siêu của D sau C). Trong Python 3 trở đi, điều này được giải quyết khi lần đầu tiên kiểm tra A. Vì vậy, MRO trở thành: D -> c -> a -> b
Khi nào một ngoại lệ có thể xảy ra?Nếu, như trong ví dụ 3 (hiển thị ở trên):
Nó sẽ gây ra một lỗi: KiểuError: Không thể tạo một thứ tự phân giải phương thức nhất quán (MRO) cho các cơ sở B, C. Giải thích: MRO mà chúng ta có thể suy luận từ các quy tắc chúng ta đã thấy là: d -> b -> c -> b -> a Tuy nhiên, B không nên đến trước c vì nó là một siêu lớp C. vì vậy, nó trở thành : D -> c -> b -> a Nhưng, trong khi khai báo lớp D, B được tuyên bố đầu tiên trong danh sách các siêu lớp; Vì vậy, nếu một phương thức tồn tại trong cả B và C, phiên bản nào nên gọi? Thứ tự phân giải phương thức: & NBSP; Thứ tự phân giải phương thức (MRO) Nó biểu thị cách ngôn ngữ lập trình giải quyết một phương thức hoặc thuộc tính. Python hỗ trợ các lớp kế thừa từ các lớp khác. Lớp được kế thừa được gọi là cha mẹ hoặc siêu lớp, trong khi lớp kế thừa được gọi là con hoặc lớp con. Trong Python, thứ tự phân giải phương thức xác định thứ tự trong đó các lớp cơ sở được tìm kiếm khi thực hiện một phương thức. Đầu tiên, phương thức hoặc thuộc tính được tìm kiếm trong một lớp và sau đó nó tuân theo thứ tự chúng tôi đã chỉ định trong khi kế thừa. Thứ tự này còn được gọi là tuyến tính hóa của một lớp và tập hợp các quy tắc được gọi là MRO (thứ tự phân giải phương thức). Trong khi kế thừa từ một lớp khác, trình thông dịch cần một cách để giải quyết các phương thức được gọi thông qua một thể hiện. Do đó, chúng ta cần thứ tự phân giải phương pháp. Ví dụ: & nbsp; & nbsp; Python3
0 1 2 3 4 5 6 7 8 class 0
2 1 2 3 4 5 6 7 8 class 0
2 In class B6 Output: In class B 6 7 8 class In class B2 The order that follows in the above code is- class B – > class A In multiple inheritances, the methods are executed based on the order specified while inheriting the classes. For the languages that support single inheritance, method resolution order is not interesting, but the languages that support multiple inheritance method resolution order plays a very crucial role. Let’s look over another example to deeply understand the method resolution order: Python3
0 1 2 3 4 5 6 7 8 class 0
2 1 2 3 4 5 6 7 8 class 0
2 1 2 3 4 5 6 7 8 class 0
2 1 b.method() 66 7 8 class In class B2 In class B6
In class B Trong ví dụ trên, các phương thức được gọi là từ lớp B nhưng không phải từ lớp A và điều này là do thứ tự phân giải phương thức (MRO). & Nbsp; thứ tự theo sau trong mã trên là lớp B-> Class A & nbsp; Trong nhiều kế thừa, các phương thức được thực thi dựa trên thứ tự được chỉ định trong khi kế thừa các lớp. Đối với các ngôn ngữ hỗ trợ kế thừa duy nhất, thứ tự phân giải phương thức không thú vị, nhưng các ngôn ngữ hỗ trợ nhiều thứ tự phân giải phương pháp kế thừa đóng một vai trò rất quan trọng. Hãy cùng xem xét một ví dụ khác để hiểu sâu sắc thứ tự giải quyết phương thức: & nbsp; & nbsp;Diamond inheritance and it looks as follows:
Python3
1 b.method() 6
5 1 b.method() 6Thứ tự phân giải phương pháp (MRO) trong cả hai kiểu khai báo là khác nhau. Các lớp kiểu cũ sử dụng DLR hoặc độ sâu đầu tiên từ trái sang phải thuật toán trong khi các lớp kiểu mới sử dụng thuật toán tuyến tính hóa C3 để phân giải phương thức trong khi thực hiện nhiều kế thừa. Tìm kiếm vì nó cần giải quyết phương thức nào phải được gọi khi một người được gọi bởi một thể hiện. Như tên cho thấy, thứ tự độ phân giải phương thức sẽ tìm kiếm độ sâu đầu tiên, sau đó đi sang trái sang phải. Ví dụ: & nbsp; & nbsp;DLR or depth-first left to right algorithm whereas new style classes use C3 Linearization algorithm for method resolution while doing multiple inheritances. Python3
0 1 b.method() 6
1 b.method() 6
00 1 b.method() 6
04 1 b.method() 6
08 1 b.method() 6Trong thuật toán ví dụ trên trước tiên xem xét lớp thể hiện cho phương thức được gọi. Nếu không có mặt, thì nó nhìn vào cha mẹ đầu tiên, nếu điều đó cũng không có mặt sau đó là cha mẹ của cha mẹ được nhìn vào. Điều này tiếp tục cho đến khi kết thúc độ sâu của lớp và cuối cùng, cho đến khi kết thúc các lớp kế thừa. Vì vậy, thứ tự độ phân giải trong ví dụ cuối cùng của chúng tôi sẽ là D, B, A, C, A. Nhưng, A không thể có mặt hai lần như vậy, thứ tự sẽ là D, B, A, C. Nhưng thuật toán này khác nhau theo những cách khác nhau và Hiển thị các hành vi khác nhau tại các thời điểm khác nhau. Vì vậy, Samuele Pedroni lần đầu tiên phát hiện ra sự không nhất quán và giới thiệu thuật toán tuyến tính hóa C3. Nó được sử dụng để loại bỏ sự không nhất quán được tạo bởi thuật toán DLR. Nó có một số hạn chế nhất định là: & nbsp; & nbsp;
Thuật toán tuyến tính hóa C3 hoạt động trên ba quy tắc: & nbsp; & nbsp;
& nbsp; & nbsp; Phương thức cho thứ tự phân giải phương thức (MRO) của một lớp: & nbsp; để có được thứ tự phân giải phương thức của một lớp chúng ta có thể sử dụng thuộc tính __mro__ hoặc mro (). Bằng cách sử dụng các phương pháp này, chúng ta có thể hiển thị thứ tự trong đó các phương thức được giải quyết. Ví dụ: & nbsp; & nbsp; Python3
0
00
00
04
00
04 6 7 44
08 7 49 7 51 Output: Constructor C ( MRO trong Python là gì?Thứ tự phân giải phương thức (MRO) Nó biểu thị cách ngôn ngữ lập trình giải quyết một phương thức hoặc thuộc tính. Python hỗ trợ các lớp kế thừa từ các lớp khác. Lớp được kế thừa được gọi là cha mẹ hoặc siêu lớp, trong khi lớp kế thừa được gọi là con hoặc lớp con.(MRO) it denotes the way a programming language resolves a method or attribute. Python supports classes inheriting from other classes. The class being inherited is called the Parent or Superclass, while the class that inherits is called the Child or Subclass.
Làm thế nào MRO được tính toán trong Python?Để có được MRO của một lớp, bạn có thể sử dụng thuộc tính __mro__ hoặc phương thức MRO (). Thuộc tính __mro__ trả về một tuple, nhưng phương thức mro () trả về một danh sách python. Để lấy một ví dụ phức tạp hơn cũng thể hiện tìm kiếm chiều sâu đầu tiên, chúng tôi lấy 6 lớp. Chúng ta có thể đại diện cho điều này với sơ đồ sau.use either the __mro__ attribute or the mro() method. The __mro__ attribute returns a tuple, but the mro() method returns a python list. To take a more complex example that also demonstrates depth-first search, we take 6 classes. We can represent this with the following diagram.
MRO được tính toán như thế nào?MRO được sử dụng chủ yếu để có được thứ tự trong đó các phương pháp nên được kế thừa với sự hiện diện của nhiều khoản thừa kế.Python 3 sử dụng thuật toán tuyến tính hóa C3 cho MRO.L [c] = c + hợp nhất tuyến tính hóa cha mẹ của C và danh sách cha mẹ của C theo thứ tự họ được thừa hưởng từ trái sang phải.L[C] = C + merge of linearization of parents of C and list of parents of C in the order they are inherited from left to right.
Làm cách nào để thay đổi MRO trong Python?Metaclass cung cấp phương thức MRO, mà chúng ta quá tải, được gọi là trong quá trình tạo lớp (cuộc gọi Metaclass '__New__) để tạo thuộc tính __mro__ ... Một phương thức MRO quá tải .. Phương thức lớp để thay đổi thuộc tính __mro__ .. Thuộc tính lớp (thay đổi_mro) để kiểm soát hành vi MRO .. |