Python thêm thuộc tính vào lớp con

Các thuộc tính thể hiện được sở hữu bởi các thể hiện cụ thể của một lớp. Đó là, đối với hai trường hợp khác nhau, các thuộc tính của trường hợp thường khác nhau. Bây giờ bạn đã quen với khái niệm này mà chúng tôi đã giới thiệu trong chương trước.

Chúng ta cũng có thể định nghĩa các thuộc tính ở cấp lớp. Thuộc tính lớp là thuộc tính được sở hữu bởi chính lớp đó. Chúng sẽ được chia sẻ bởi tất cả các thể hiện của lớp. Do đó, chúng có cùng giá trị cho mọi trường hợp. Chúng tôi định nghĩa các thuộc tính lớp bên ngoài tất cả các phương thức, thường chúng được đặt ở trên cùng, ngay bên dưới tiêu đề lớp

Trong phiên Python tương tác sau đây, chúng ta có thể thấy rằng thuộc tính lớp "a" giống nhau cho tất cả các phiên bản, trong ví dụ của chúng tôi là "x" và "y". Bên cạnh đó, chúng ta thấy rằng chúng ta có thể truy cập một thuộc tính lớp thông qua một thể hiện hoặc thông qua tên lớp

class A:
    a = "I am a class attribute!"
x = A[]
y = A[]
x.a

ĐẦU RA

'I am a class attribute!'

y.a

ĐẦU RA

'I am a class attribute!'

A.a

ĐẦU RA

'I am a class attribute!'

Nhưng hãy cẩn thận, nếu bạn muốn thay đổi một thuộc tính của lớp, bạn phải thực hiện việc đó với ký hiệu ClassName. Tên thuộc tính. Nếu không, bạn sẽ tạo một biến thể hiện mới. Chúng tôi chứng minh điều này trong ví dụ sau

class A:
    a = "I am a class attribute!"
x = A[]
y = A[]
x.a = "This creates a new instance attribute for x!"

y.a

ĐẦU RA

'I am a class attribute!'

A.a

ĐẦU RA

'I am a class attribute!'

'I am a class attribute!'
1

A.a

ĐẦU RA

'I am a class attribute!'
3

y.a

ĐẦU RA

'I am a class attribute!'
3

'I am a class attribute!'
6

ĐẦU RA

'I am a class attribute!'
7

Các thuộc tính lớp và thuộc tính đối tượng của Python được lưu trữ trong các từ điển riêng biệt, như chúng ta có thể thấy ở đây

'I am a class attribute!'
8

ĐẦU RA

'I am a class attribute!'
9

y.a
0

ĐẦU RA

y.a
1

y.a
2

ĐẦU RA

y.a
3

y.a
4

ĐẦU RA

y.a
3

Đào tạo Python trực tiếp

Thưởng thức trang này?

Thấy. Tổng quan về các khóa học Python trực tiếp

đăng ký tại đây

Ví dụ với các thuộc tính lớp

Isaac Asimov đã nghĩ ra và giới thiệu cái gọi là "Ba định luật của người máy" vào năm 1942. Xuất hiện trong câu chuyện của anh ấy "Runaround". Ba định luật của ông đã được nhiều nhà văn khoa học viễn tưởng nhặt nhạnh. Vì chúng tôi đã bắt đầu sản xuất rô-bốt bằng Python, nên đã đến lúc đảm bảo rằng chúng tuân theo ba định luật của Asimov. Vì chúng giống nhau cho mọi trường hợp, tôi. e. robot, chúng ta sẽ tạo thuộc tính lớp Three_Laws. Thuộc tính này là một bộ với ba luật

y.a
6

Như chúng tôi đã đề cập trước đây, chúng tôi có thể truy cập một thuộc tính lớp thông qua cá thể hoặc thông qua tên lớp. Bạn có thể thấy trong phần sau đây rằng chúng tôi không cần một ví dụ

y.a
7

ĐẦU RA

y.a
8

Trong ví dụ sau, chúng tôi chứng minh, cách bạn có thể đếm phiên bản với các thuộc tính lớp. Tất cả những gì chúng ta phải làm là

  • để tạo một thuộc tính lớp, mà chúng tôi gọi là "bộ đếm" trong ví dụ của chúng tôi
  • để tăng thuộc tính này lên 1 mỗi khi một phiên bản mới được tạo
  • để giảm thuộc tính đi 1 mỗi khi một thể hiện bị hủy

y.a
9

ĐẦU RA

'I am a class attribute!'
0

Về cơ bản, chúng ta có thể đã viết C. truy cập thay vì loại [tự]. bộ đếm, bởi vì kiểu [bản thân] sẽ được đánh giá là "C". Tuy nhiên, chúng ta sẽ hiểu sau, kiểu [bản thân] đó có ý nghĩa, nếu chúng ta sử dụng một lớp như vậy làm lớp cha

Phương thức tĩnh

Chúng tôi đã sử dụng thuộc tính lớp làm thuộc tính công khai trong phần trước. Tất nhiên, chúng ta cũng có thể đặt các thuộc tính công khai thành riêng tư. Chúng ta có thể làm điều này bằng cách thêm lại dấu gạch dưới kép. Nếu chúng tôi làm như vậy, chúng tôi cần có khả năng truy cập và thay đổi các thuộc tính lớp riêng này. Chúng ta có thể sử dụng các phương thức thể hiện cho mục đích này

'I am a class attribute!'
1

ĐẦU RA

'I am a class attribute!'
2

Đây không phải là một ý tưởng tốt vì hai lý do. Trước hết, vì số lượng rô bốt không liên quan gì đến một phiên bản rô bốt và thứ hai là vì chúng tôi không thể hỏi số lượng rô bốt trước khi tạo phiên bản. Nếu chúng ta cố gọi phương thức có tên lớp là Robot. RobotInstances[], chúng tôi nhận được thông báo lỗi vì nó cần một phiên bản làm đối số

'I am a class attribute!'
3

ĐẦU RA

'I am a class attribute!'
4

Ý tưởng tiếp theo vẫn không giải quyết được vấn đề của chúng ta là bỏ qua tham số "self"

'I am a class attribute!'
5

Bây giờ có thể truy cập phương thức thông qua tên lớp, nhưng chúng ta không thể gọi nó thông qua một thể hiện

'I am a class attribute!'
6

ĐẦU RA

'I am a class attribute!'
7

'I am a class attribute!'
8

ĐẦU RA

'I am a class attribute!'
9

Cuộc gọi "x. RobotInstances[]" được coi là lệnh gọi phương thức thể hiện và phương thức thể hiện cần tham chiếu đến thể hiện dưới dạng tham số đầu tiên

Vì vậy, những gì chúng ta muốn?

Giải pháp nằm ở các phương thức tĩnh, không cần tham chiếu đến một thể hiện. Thật dễ dàng để biến một phương thức thành một phương thức tĩnh. Tất cả những gì chúng ta phải làm là thêm một dòng có "@staticmethod" ngay trước tiêu đề phương thức. Đó là cú pháp trang trí

Bạn có thể thấy trong ví dụ sau rằng giờ đây chúng ta có thể sử dụng phương thức RobotInstances của mình theo cách chúng ta muốn

A.a
0

ĐẦU RA

A.a
1

Đào tạo Python trực tiếp

Thưởng thức trang này?

Thấy. Tổng quan về các khóa học Python trực tiếp

Các khóa học trực tuyến sắp tới

Khóa học nâng cao chuyên sâu

Lập trình hướng đối tượng với Python

đăng ký tại đây

phương pháp lớp

Các phương thức tĩnh không nên nhầm lẫn với các phương thức lớp. Giống như các phương thức tĩnh, các phương thức của lớp không bị ràng buộc với các thể hiện, nhưng không giống như các phương thức lớp tĩnh, các phương thức của lớp được liên kết với một lớp. Tham số đầu tiên của một phương thức lớp là một tham chiếu đến một lớp, tôi. e. một đối tượng lớp. Chúng có thể được gọi thông qua một thể hiện hoặc tên lớp

A.a
2

ĐẦU RA

A.a
3

Các trường hợp sử dụng của các phương thức lớp

  • Chúng được sử dụng trong định nghĩa của cái gọi là phương thức xuất xưởng mà chúng tôi sẽ không đề cập ở đây
  • Chúng thường được sử dụng khi chúng ta có các phương thức tĩnh, các phương thức này phải gọi các phương thức tĩnh khác. Để làm điều này, chúng ta sẽ phải viết mã cứng tên lớp, nếu chúng ta phải sử dụng các phương thức tĩnh. Đây là một vấn đề, nếu chúng ta đang ở trong một trường hợp sử dụng, nơi chúng ta có các lớp kế thừa

Chương trình sau chứa một lớp phân số, lớp này vẫn chưa hoàn thành. Nếu bạn làm việc với phân số, bạn cần có khả năng rút gọn phân số, e. g. phân số 8/24 có thể rút gọn thành 1/3. Chúng ta có thể rút gọn một phân số thành các số hạng nhỏ nhất bằng cách chia cả tử số và mẫu số cho Ước chung lớn nhất [GCD]

Chúng tôi đã xác định hàm gcd tĩnh để tính ước số chung lớn nhất của hai số. ước chung lớn nhất [gcd] của hai hoặc nhiều số nguyên [ít nhất một trong số đó không phải là số không], là số nguyên dương lớn nhất chia các số mà không có phần dư. Ví dụ: 'GCD của 8 và 24 là 8. Phương thức tĩnh "gcd" được gọi bởi phương thức lớp của chúng ta là "reduce" với "cls. gcd[n1, n2]". "CLS" là tham chiếu đến "phân số"

A.a
4

Sử dụng lớp này

A.a
5

ĐẦU RA

A.a
6

Phương thức lớp so với. Phương thức tĩnh và phương thức sơ thẩm

Ví dụ cuối cùng của chúng ta sẽ chứng minh tính hữu ích của các phương thức lớp trong kế thừa. Chúng tôi định nghĩa một lớp

'I am a class attribute!'
3 với một phương thức
'I am a class attribute!'
4. Phương pháp này sẽ cung cấp một số thông tin lớp chung. Lớp
'I am a class attribute!'
5 sẽ được kế thừa cả trong lớp con
'I am a class attribute!'
6 và
'I am a class attribute!'
5. Phương thức
'I am a class attribute!'
4 cũng sẽ được kế thừa. Chúng tôi sẽ chứng minh rằng chúng tôi sẽ gặp sự cố, nếu chúng tôi xác định phương thức
'I am a class attribute!'
4 là một phương thức thể hiện bình thường hoặc là một phương thức tĩnh. Chúng ta sẽ bắt đầu bằng cách định nghĩa
'I am a class attribute!'
4 như một phương thức thể hiện

A.a
7

ĐẦU RA

A.a
8

Điều này thoạt nhìn có thể ổn ngay từ cái nhìn đầu tiên. Suy nghĩ thứ hai, chúng tôi nhận ra thiết kế khủng khiếp. Chúng tôi phải tạo các thể hiện của các lớp

'I am a class attribute!'
3,
'I am a class attribute!'
6 và
'I am a class attribute!'
5 để có thể hỏi lớp đó nói về cái gì. Sẽ tốt hơn rất nhiều nếu chúng ta chỉ cần viết
class A:
    a = "I am a class attribute!"
x = A[]
y = A[]
x.a = "This creates a new instance attribute for x!"
4,
class A:
    a = "I am a class attribute!"
x = A[]
y = A[]
x.a = "This creates a new instance attribute for x!"
5 và
class A:
    a = "I am a class attribute!"
x = A[]
y = A[]
x.a = "This creates a new instance attribute for x!"
6 để có được kết quả trước đó. Chúng ta không thể làm điều này. Thay vào đó, chúng ta sẽ phải viết
class A:
    a = "I am a class attribute!"
x = A[]
y = A[]
x.a = "This creates a new instance attribute for x!"
7,
class A:
    a = "I am a class attribute!"
x = A[]
y = A[]
x.a = "This creates a new instance attribute for x!"
8 và
class A:
    a = "I am a class attribute!"
x = A[]
y = A[]
x.a = "This creates a new instance attribute for x!"
9

Bây giờ, chúng ta sẽ định nghĩa phương thức

'I am a class attribute!'
4 là một "phương thức tĩnh" để chỉ ra nhược điểm của phương pháp này. Như chúng ta đã học trước đây trong hướng dẫn của mình, một phương thức tĩnh không có tham số đầu tiên có tham chiếu đến một đối tượng. Vì vậy, về sẽ không có tham số nào cả. Do đó, giờ đây chúng ta có thể gọi "about" mà không cần chuyển một thể hiện dưới dạng tham số, tôi. e.
class A:
    a = "I am a class attribute!"
x = A[]
y = A[]
x.a = "This creates a new instance attribute for x!"
4,
class A:
    a = "I am a class attribute!"
x = A[]
y = A[]
x.a = "This creates a new instance attribute for x!"
5 và
class A:
    a = "I am a class attribute!"
x = A[]
y = A[]
x.a = "This creates a new instance attribute for x!"
6. Tuy nhiên, một vấn đề ẩn giấu trong định nghĩa của
'I am a class attribute!'
4. Cách duy nhất để truy cập thông tin lớp học
y.a
5 là đặt tên lớp học ở phía trước. Chúng tôi tùy ý đưa vào
'I am a class attribute!'
3. Chúng tôi cũng có thể đặt ở đó
'I am a class attribute!'
5 hoặc
'I am a class attribute!'
6. Bất kể chúng ta làm gì, giải pháp sẽ không như chúng ta muốn

A.a
9

ĐẦU RA

'I am a class attribute!'
0

Nói cách khác, chúng ta không có cách nào để phân biệt giữa lớp

'I am a class attribute!'
3 và các lớp con của nó là
'I am a class attribute!'
6 và
'I am a class attribute!'
5. Vấn đề là phương thức
'I am a class attribute!'
4 không biết rằng nó đã được gọi thông qua lớp
'I am a class attribute!'
3, lớp
'I am a class attribute!'
6 hoặc lớp
'I am a class attribute!'
5

Một classmethod là giải pháp cho tất cả các vấn đề của chúng tôi. Chúng ta sẽ trang trí

'I am a class attribute!'
4 bằng một classmethod decorator thay vì một staticmethod decorator

Các thuộc tính có được kế thừa trong Python không?

Các đối tượng được định nghĩa bởi các lớp, các lớp có thể kế thừa các thuộc tính và hành vi từ các lớp có sẵn . Các lớp kết quả được gọi là lớp dẫn xuất hoặc lớp con. Một lớp con “kế thừa” tất cả các thuộc tính [phương thức, v.v.] của lớp cha.

Lớp cha có thể kế thừa các thuộc tính của lớp con trong Python không?

Trong Python, bạn có thể lấy các tính năng bạn muốn từ một lớp [cha] hiện có để tạo một lớp mới [con] . Tính năng Python này được gọi là tính kế thừa.

Các lớp có thể có thuộc tính Python không?

Giới thiệu về lập trình hướng đối tượng [OOP] trong Python . Chúng tôi phân biệt giữa thuộc tính thể hiện và thuộc tính lớp. Classes contain characteristics called Attributes. We make a distinction between instance attributes and class attributes.

Làm cách nào chúng ta có thể tham chiếu đến một thuộc tính của lớp cha?

Để truy cập các thuộc tính của lớp cha trong một lớp con. .
Sử dụng phương thức super[] để gọi phương thức khởi tạo của cha trong con
Phương thức __init__[] sẽ thiết lập các biến thể hiện
Truy cập bất kỳ thuộc tính hoặc phương thức nào của lớp cha trên đối tượng self

Chủ Đề