Lớp mở rộng Python không kế thừa

Kế thừa là một nguyên tắc lập trình được thiết lập tốt và PHP sử dụng nguyên tắc này trong mô hình đối tượng của nó. Nguyên tắc này sẽ ảnh hưởng đến cách nhiều lớp và đối tượng liên quan với nhau

Ví dụ: khi mở rộng một lớp, lớp con sẽ kế thừa tất cả các phương thức, thuộc tính và hằng số công khai và được bảo vệ từ lớp cha. Trừ khi một lớp ghi đè các phương thức đó, chúng sẽ giữ nguyên chức năng ban đầu của chúng

Điều này hữu ích cho việc xác định và trừu tượng hóa chức năng, đồng thời cho phép triển khai chức năng bổ sung trong các đối tượng tương tự mà không cần phải triển khai lại tất cả các chức năng được chia sẻ

Các phương thức riêng của lớp cha không thể truy cập được đối với lớp con. Kết quả là, các lớp con có thể tự hiện thực lại một phương thức riêng tư mà không cần quan tâm đến các quy tắc kế thừa thông thường. Trước PHP 8. 0. 0, tuy nhiên, các hạn chế của finalstatic đã được áp dụng cho các phương pháp riêng tư. Kể từ PHP 8. 0. 0, hạn chế phương thức riêng tư duy nhất được thực thi là các hàm tạo private final, vì đó là cách phổ biến để "vô hiệu hóa" hàm tạo khi sử dụng các phương thức tĩnh của nhà máy thay thế

Khả năng hiển thị của các phương thức, thuộc tính và hằng số có thể được nới lỏng, e. g. một phương pháp protected có thể được đánh dấu là public, nhưng chúng không thể bị hạn chế, e. g. đánh dấu tài sản publicprivate

Ghi chú

Trừ khi autoloading được sử dụng, các lớp phải được xác định trước khi chúng được sử dụng. Nếu một lớp mở rộng một lớp khác, thì lớp cha phải được khai báo trước cấu trúc lớp con. Quy tắc này áp dụng cho các lớp kế thừa các lớp và giao diện khác

Ghi chú

Không được phép ghi đè thuộc tính đọc ghi bằng a hoặc ngược lại

class A {
public int $prop;
}
class B extends A {
// Illegal: read-write -> readonly
public readonly int $prop;
}
?>

Ví dụ #1 Ví dụ về kế thừa

class Foo
{
public function printItem[$string]
{
echo 'Foo: ' . $string . PHP_EOL;
}

public function printPHP[]
{
echo 'PHP is great.' . PHP_EOL;
}
}

static0

static1

static2

Khả năng tương thích của loại trả về với các lớp bên trong

Trước PHP 8. 1, hầu hết các lớp hoặc phương thức bên trong không khai báo kiểu trả về của chúng và mọi kiểu trả về đều được phép khi mở rộng chúng

Kể từ PHP 8. 1. 0, hầu hết các phương thức nội bộ bắt đầu "tạm thời" khai báo kiểu trả về của chúng, trong trường hợp đó, kiểu trả về của các phương thức phải tương thích với kiểu gốc được mở rộng; . Lưu ý rằng việc thiếu khai báo trả về rõ ràng cũng được coi là chữ ký không khớp và do đó dẫn đến thông báo không dùng nữa

Nếu kiểu trả về không thể được khai báo cho một phương thức ghi đè do lo ngại về khả năng tương thích giữa các phiên bản PHP, thì có thể thêm thuộc tính ReturnTypeWillChange để tắt thông báo ngừng sử dụng

Trong Python, chúng ta có thể mở rộng một lớp để tạo một lớp mới từ lớp hiện có. Điều này trở nên khả thi vì Python hỗ trợ tính năng kế thừa

Sử dụng tính kế thừa, chúng ta có thể tạo một lớp con với tất cả các tính năng và phương thức của lớp cha. Chúng ta cũng có thể thêm các tính năng mới vào lớp con ngoài những tính năng có trong lớp cha

Chúng tôi thậm chí có thể ghi đè các tính năng của lớp cha mà chúng tôi không cần. Bạn sẽ học cách làm tất cả những điều đó khi xem qua bài viết này

Nói một cách đơn giản, mở rộng một lớp có nghĩa là chúng ta muốn tạo một lớp mới hoặc lớp con từ một lớp cha hoặc lớp hiện có. Mở rộng một lớp cũng giống như kế thừa một lớp

Hãy cho chúng tôi xem cách hoạt động của tính kế thừa trong Python

Mở rộng một lớp bằng tính kế thừa trong Python

Để kế thừa một lớp trong Python, chúng ta truyền tên của lớp đó làm tham số trong khi tạo lớp con

cú pháp

class ChildClass[ParentClass]

Hãy để chúng tôi hiểu điều này với một ví dụ

Đầu tiên chúng ta tạo một lớp cha,

class Desserts:
    def __init__[self, flavor, color]:
        self.flavor = flavor
        self.color = color

    def intro[self]:
        print[self.flavor, self.color]

obj = Desserts["Vanilla", "Pink"]
obj.intro[]
2, với hai phương thức -
class Desserts:
    def __init__[self, flavor, color]:
        self.flavor = flavor
        self.color = color

    def intro[self]:
        print[self.flavor, self.color]

obj = Desserts["Vanilla", "Pink"]
obj.intro[]
3 và
class Desserts:
    def __init__[self, flavor, color]:
        self.flavor = flavor
        self.color = color

    def intro[self]:
        print[self.flavor, self.color]

obj = Desserts["Vanilla", "Pink"]
obj.intro[]
4. Phương thức
class Desserts:
    def __init__[self, flavor, color]:
        self.flavor = flavor
        self.color = color

    def intro[self]:
        print[self.flavor, self.color]

obj = Desserts["Vanilla", "Pink"]
obj.intro[]
4 có một câu lệnh in in hương vị và màu sắc được hiển thị trong đầu ra

class Desserts:
    def __init__[self, flavor, color]:
        self.flavor = flavor
        self.color = color

    def intro[self]:
        print[self.flavor, self.color]

obj = Desserts["Vanilla", "Pink"]
obj.intro[]

đầu ra

Chúng ta tạo lớp con,

class Desserts:
    def __init__[self, flavor, color]:
        self.flavor = flavor
        self.color = color

    def intro[self]:
        print[self.flavor, self.color]

obj = Desserts["Vanilla", "Pink"]
obj.intro[]
6 sẽ kế thừa lớp,
class Desserts:
    def __init__[self, flavor, color]:
        self.flavor = flavor
        self.color = color

    def intro[self]:
        print[self.flavor, self.color]

obj = Desserts["Vanilla", "Pink"]
obj.intro[]
2. Để lớp
class Desserts:
    def __init__[self, flavor, color]:
        self.flavor = flavor
        self.color = color

    def intro[self]:
        print[self.flavor, self.color]

obj = Desserts["Vanilla", "Pink"]
obj.intro[]
6 kế thừa lớp
class Desserts:
    def __init__[self, flavor, color]:
        self.flavor = flavor
        self.color = color

    def intro[self]:
        print[self.flavor, self.color]

obj = Desserts["Vanilla", "Pink"]
obj.intro[]
2, chúng ta sẽ chuyển tên của lớp
class Desserts:
    def __init__[self, flavor, color]:
        self.flavor = flavor
        self.color = color

    def intro[self]:
        print[self.flavor, self.color]

obj = Desserts["Vanilla", "Pink"]
obj.intro[]
2 làm tham số trong khi tạo lớp
class Desserts:
    def __init__[self, flavor, color]:
        self.flavor = flavor
        self.color = color

    def intro[self]:
        print[self.flavor, self.color]

obj = Desserts["Vanilla", "Pink"]
obj.intro[]
6

Chúng tôi đang sử dụng từ khóa

class Desserts:
    def __init__[self, flavor, color]:
        self.flavor = flavor
        self.color = color

    def intro[self]:
        print[self.flavor, self.color]

obj = Desserts["Vanilla", "Pink"]
obj.intro[]

class Cake[Desserts]:
    pass

obj = Cake["Black forest", "Black"]
obj.intro[]
2 ở đây bởi vì chúng tôi chỉ kế thừa lớp,
class Desserts:
    def __init__[self, flavor, color]:
        self.flavor = flavor
        self.color = color

    def intro[self]:
        print[self.flavor, self.color]

obj = Desserts["Vanilla", "Pink"]
obj.intro[]
2 và không thêm bất kỳ phương thức hoặc tính năng nào khác vào lớp con,
class Desserts:
    def __init__[self, flavor, color]:
        self.flavor = flavor
        self.color = color

    def intro[self]:
        print[self.flavor, self.color]

obj = Desserts["Vanilla", "Pink"]
obj.intro[]
6. Lớp
class Desserts:
    def __init__[self, flavor, color]:
        self.flavor = flavor
        self.color = color

    def intro[self]:
        print[self.flavor, self.color]

obj = Desserts["Vanilla", "Pink"]
obj.intro[]

class Cake[Desserts]:
    pass

obj = Cake["Black forest", "Black"]
obj.intro[]
5 hiện có các thuộc tính và phương thức giống như lớp
class Desserts:
    def __init__[self, flavor, color]:
        self.flavor = flavor
        self.color = color

    def intro[self]:
        print[self.flavor, self.color]

obj = Desserts["Vanilla", "Pink"]
obj.intro[]
2

Chúng ta có thể xác minh điều này bằng cách tạo một đối tượng của lớp

class Desserts:
    def __init__[self, flavor, color]:
        self.flavor = flavor
        self.color = color

    def intro[self]:
        print[self.flavor, self.color]

obj = Desserts["Vanilla", "Pink"]
obj.intro[]
6 và sau đó thực thi phương thức
class Desserts:
    def __init__[self, flavor, color]:
        self.flavor = flavor
        self.color = color

    def intro[self]:
        print[self.flavor, self.color]

obj = Desserts["Vanilla", "Pink"]
obj.intro[]
4 như được hiển thị trong hai dòng mã cuối cùng

class Desserts:
    def __init__[self, flavor, color]:
        self.flavor = flavor
        self.color = color

    def intro[self]:
        print[self.flavor, self.color]

obj = Desserts["Vanilla", "Pink"]
obj.intro[]

class Cake[Desserts]:
    pass

obj = Cake["Black forest", "Black"]
obj.intro[]

đầu ra

Vanilla Pink
Black forest Black

Xem cách lớp

class Desserts:
    def __init__[self, flavor, color]:
        self.flavor = flavor
        self.color = color

    def intro[self]:
        print[self.flavor, self.color]

obj = Desserts["Vanilla", "Pink"]
obj.intro[]
6 cũng thực thi phương thức
class Desserts:
    def __init__[self, flavor, color]:
        self.flavor = flavor
        self.color = color

    def intro[self]:
        print[self.flavor, self.color]

obj = Desserts["Vanilla", "Pink"]
obj.intro[]
4 giống như lớp
class Desserts:
    def __init__[self, flavor, color]:
        self.flavor = flavor
        self.color = color

    def intro[self]:
        print[self.flavor, self.color]

obj = Desserts["Vanilla", "Pink"]
obj.intro[]
2

Hãy xem cách chúng ta có thể thêm nhiều phương thức và thuộc tính vào lớp con mới được tạo này

Thêm chức năng
Vanilla Pink
Black forest Black
2 vào lớp con sau khi mở rộng lớp

Chúng ta có thể thêm một hàm

Vanilla Pink
Black forest Black
3 mới vào lớp con ngay cả khi kế thừa một lớp. Lưu ý rằng bất cứ khi nào một đối tượng của một lớp được tạo, hàm
Vanilla Pink
Black forest Black
3 sẽ tự động được gọi

Ngoài ra, việc thêm hàm

Vanilla Pink
Black forest Black
3 vào lớp con sẽ không sử dụng hàm
Vanilla Pink
Black forest Black
3 của lớp cha

class Cake[Desserts]:
    def __init__[self, flavor, color]:
        self.flavor = flavor
        self.color = color

Mặc dù phương thức

Vanilla Pink
Black forest Black
3 của lớp con ghi đè tính kế thừa của phương thức
Vanilla Pink
Black forest Black
3 của lớp cha, nhưng chúng ta vẫn có thể sử dụng phương thức
Vanilla Pink
Black forest Black
3 của lớp cha bằng cách gọi nó như thế này

class Cake[Desserts]:
    def __init__[self, flavor, color]:
        Desserts.__init__[self, flavor, color]

Sử dụng hàm
class Cake[Desserts]:
    def __init__[self, flavor, color]:
        self.flavor = flavor
        self.color = color
0 sau khi mở rộng một lớp trong Python

Trong Python, hàm

class Cake[Desserts]:
    def __init__[self, flavor, color]:
        self.flavor = flavor
        self.color = color
0 có thể được sử dụng để truy cập các thuộc tính và phương thức của lớp cha

Khi có một

Vanilla Pink
Black forest Black
3 mới bên trong một lớp con đang sử dụng phương thức
Vanilla Pink
Black forest Black
3 của lớp cha, thì chúng ta có thể sử dụng hàm
class Cake[Desserts]:
    def __init__[self, flavor, color]:
        self.flavor = flavor
        self.color = color
0 để kế thừa tất cả các phương thức và thuộc tính từ lớp cha

class Cake[Desserts]:
    def __init__[self, flavor, color]:
        super[].__init__[flavor, color]

Lưu ý rằng ở đây, chúng tôi không chỉ định tên của lớp cha;

Đây là tất cả những kiến ​​thức cơ bản về kế thừa trong Python

Nhưng nếu chúng ta phải thêm nhiều thuộc tính hoặc phương thức vào lớp con thì sao?

Thêm thuộc tính vào lớp con sau khi mở rộng lớp trong Python

Chúng ta có thể thêm các thuộc tính bổ sung vào một lớp con ngoài những thuộc tính được kế thừa bởi lớp cha giống như chúng ta thêm bất kỳ thuộc tính nào khác. Xem cách một thuộc tính có tên là

class Cake[Desserts]:
    def __init__[self, flavor, color]:
        self.flavor = flavor
        self.color = color
6 được thêm vào lớp
class Desserts:
    def __init__[self, flavor, color]:
        self.flavor = flavor
        self.color = color

    def intro[self]:
        print[self.flavor, self.color]

obj = Desserts["Vanilla", "Pink"]
obj.intro[]
6

class Cake[Desserts]:
    def __init__[self, flavor, color, quantity]:
        super[].__init__[flavor, color]
        self.quantity = quantity

Chúng tôi đã thêm một tham số nữa trong hàm

Vanilla Pink
Black forest Black
3 của lớp con. Ngoài ra, đừng quên truyền thêm một giá trị cho
class Cake[Desserts]:
    def __init__[self, flavor, color]:
        self.flavor = flavor
        self.color = color
6 trong khi tạo đối tượng của lớp
class Desserts:
    def __init__[self, flavor, color]:
        self.flavor = flavor
        self.color = color

    def intro[self]:
        print[self.flavor, self.color]

obj = Desserts["Vanilla", "Pink"]
obj.intro[]
6, như thế này

obj = Cake["Black forest", "Black", 5]

Thêm phương thức vào lớp con sau khi mở rộng lớp trong Python

Chúng tôi thêm một phương thức

class Cake[Desserts]:
    def __init__[self, flavor, color]:
        Desserts.__init__[self, flavor, color]
1 trong lớp con bằng cách sử dụng từ khóa
class Cake[Desserts]:
    def __init__[self, flavor, color]:
        Desserts.__init__[self, flavor, color]
2 trong mã bên dưới. Chúng tôi cũng chuyển từ khóa
class Cake[Desserts]:
    def __init__[self, flavor, color]:
        Desserts.__init__[self, flavor, color]
3 làm tham số

class Cake[Desserts]:
    def __init__[self, flavor, color, quantity]:
        super[].__init__[flavor, color]
        self.quantity = quantity

    def price[self]:
        print["Pay for: ", self.quantity, "items."]

Toàn bộ mã sẽ như sau

class Desserts:
    def __init__[self, flavor, color]:
        self.flavor = flavor
        self.color = color

    def intro[self]:
        print[self.flavor, self.color]

obj = Desserts["Vanilla", "Pink"]
obj.intro[]
0

đầu ra

class Desserts:
    def __init__[self, flavor, color]:
        self.flavor = flavor
        self.color = color

    def intro[self]:
        print[self.flavor, self.color]

obj = Desserts["Vanilla", "Pink"]
obj.intro[]
1

Lưu ý rằng việc thêm một phương thức có cùng tên với bất kỳ phương thức nào trong lớp cha sẽ ghi đè lên phương thức kế thừa

Bạn có thể mở rộng lớp bằng Python không?

Mục tiêu mở rộng một phương thức lớp trong Python có thể đạt được bằng Kế thừa . Một trong những lợi thế chính được cung cấp bằng cách mở rộng một phương thức là nó làm cho mã có thể tái sử dụng. Hơn nữa, nhiều lớp con có thể chia sẻ cùng một mã và thậm chí được phép cập nhật nó theo yêu cầu.

__ mới __ trong Python là gì?

Python __new__[] là phương thức khởi tạo kiểm soát việc tạo phiên bản mới . Nó được gọi đầu tiên và nó trả về một thể hiện của lớp mới. Python __init__[] là phương thức khởi tạo để thiết lập các thuộc tính [i. e. , trạng thái] của phiên bản mới được tạo. Nó được gọi sau khi tạo và không trả về gì cả, tôi. e. , Không có.

Làm cách nào bạn có thể tăng cường thay vì thay thế hoàn toàn phương thức kế thừa Python?

Một cách phức tạp hơn để tăng cường một phương thức kế thừa liên quan đến việc chuyển tiếp. Chuyển tiếp thư cho phép bạn bổ sung một phương thức được kế thừa theo cách mà phương thức đó có thể thực hiện hành động kế thừa và một số hành động mới.

Từ khóa nào dưới đây được sử dụng để mở rộng một lớp từ một lớp khác trong Python?

Kế thừa cho phép chúng ta định nghĩa một lớp kế thừa tất cả các phương thức và thuộc tính từ một lớp khác. Lớp cha là lớp được kế thừa từ đó, còn được gọi là lớp cơ sở

Chủ Đề