Câu trả lời của Michael rất hay và đơn giản, nhưng nếu bạn muốn tránh phải thêm dòng đó vào từng lớp con đơn vị - có thể bạn có một loạt các danh sách khác như thế, một metaclass là một cách dễ dàng để giải quyết vấn đề
class UnitMeta[type]:
def __init__[self, *args]:
super[UnitMeta, self].__init__[*args]
self.listvalue = [10]
class Unit[object]:
__metaclass__ = UnitMeta
pass
class Archer[Unit]:
pass
print Unit.listvalue
print Archer.listvalue
Archer.listvalue[0] = 5
print Unit.listvalue
print Archer.listvalue
output:
[10]
[10]
[10]
[5]
Bạn cũng có thể mở rộng ý tưởng tương tự này để tự động tìm và sao chép danh sách [và dicts] được xác định trong đơn vị
class UnitMeta[type]:
def __init__[self, *args]:
super[UnitMeta, self].__init__[*args]
for superclass in self.__mro__:
for k,v in vars[superclass].items[]:
if isinstance[v, [list, dict, ]]:
setattr[self, k, type[v][v]]
class Unit[object]:
__metaclass__ = UnitMeta
listvalue = [10]
class Archer[Unit]:
pass
Khi bạn liên kết một thuộc tính với một lớp sản phẩm, nó được kế thừa bởi tất cả các lớp con thành viên. Nếu bạn chỉnh sửa một thuộc tính trên lớp sản phẩm nơi nó được xác định ban đầu, các thay đổi tuyên truyền cho tất cả các lớp con thành viên. Định nghĩa thuộc tính là thống nhất cho tất cả các lớp con kế thừa nó.
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. is the class being inherited from, also called base class.
Kế thừa Python is the class that inherits from another class, also called derived class.
Kế thừa cho phép chúng tôi xác định 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, còn được gọi là lớp cơ sở.
Lớp con là lớp kế thừa từ một lớp khác, còn được gọi là lớp dẫn xuất.
Tạo một lớp cha mẹ
Bất kỳ lớp nào cũng có thể là lớp cha, vì vậy cú pháp giống như tạo bất kỳ lớp nào khác:
def __init__[self, fname, lname]:
self.firstname = fname
self.lastname = lname
Thí dụ
print[self.firstname, self.lastname]
Tạo một lớp có tên Person
, với các thuộc tính firstname
và lastname
và phương thức printname
:
người lớp: & nbsp; def __init __ [self, fname, lname]: & nbsp; & nbsp; & nbsp; self.firstname = fname & nbsp; & nbsp; & nbsp; self.lastName = lname
x.printname[]
Hãy tự mình thử »
& nbsp; DEF printName [self]: & nbsp; & nbsp; & nbsp; in [self.firstname, self.lastname]
#Sử dụng lớp người để tạo một đối tượng, sau đó thực thi phương thức printName:
Thí dụ
Thêm tham số Person
0 và vượt qua đúng năm khi tạo đối tượng:
Học sinh lớp [Người]: & NBSP; def __init __ [tự, fname, lname, năm]: & nbsp; & nbsp; & nbsp; Super [] .__ init __ [fname, lname] & nbsp; & nbsp; & nbsp; Tự. Tốt nghiệp = năm
pass
X = Sinh viên ["Mike", "Olsen", 2019]
Use the pass
keyword when you do not want to add any other properties or methods to the class.
Thêm phương thức
Thí dụ
Thêm tham số Person
0 và vượt qua đúng năm khi tạo đối tượng:
Học sinh lớp [Người]: & NBSP; def __init __ [tự, fname, lname, năm]: & nbsp; & nbsp; & nbsp; Super [] .__ init __ [fname, lname] & nbsp; & nbsp; & nbsp; Tự. Tốt nghiệp = năm
x.printname[]
Hãy tự mình thử »
X = Sinh viên ["Mike", "Olsen", 2019]
Thêm phương thức
Thêm một phương thức gọi là Person
1 vào lớp Student
:
& nbsp; Def Welcome [self]: & nbsp; & nbsp; & nbsp; in ["Chào mừng", self.firstname, self.lastname, "đến lớp của", self.gradyyyear] The
[10]
[10]
[10]
[5]
2 function is called automatically every time the class is being used to create a new object.Thí dụ
Thêm tham số Person
0 và vượt qua đúng năm khi tạo đối tượng:
Học sinh lớp [Người]: & NBSP; def __init __ [tự, fname, lname, năm]: & nbsp; & nbsp; & nbsp; Super [] .__ init __ [fname, lname] & nbsp; & nbsp; & nbsp; Tự. Tốt nghiệp = năm
def __init__[self, fname,
lname]:
#add properties etc.
X = Sinh viên ["Mike", "Olsen", 2019]
Thêm phương thức The child's
[10]
[10]
[10]
[5]
2 function overrides the inheritance of the parent's class UnitMeta[type]:
def __init__[self, *args]:
super[UnitMeta, self].__init__[*args]
for superclass in self.__mro__:
for k,v in vars[superclass].items[]:
if isinstance[v, [list, dict, ]]:
setattr[self, k, type[v][v]]
class Unit[object]:
__metaclass__ = UnitMeta
listvalue = [10]
class Archer[Unit]:
pass
0 function.Thêm một phương thức gọi là Person
1 vào lớp Student
:
Thí dụ
Thêm tham số Person
0 và vượt qua đúng năm khi tạo đối tượng:
def __init__[self,
fname, lname]:
Person.__init__[self, fname, lname]
Hãy tự mình thử »
Học sinh lớp [Người]: & NBSP; def __init __ [tự, fname, lname, năm]: & nbsp; & nbsp; & nbsp; Super [] .__ init __ [fname, lname] & nbsp; & nbsp; & nbsp; Tự. Tốt nghiệp = năm
X = Sinh viên ["Mike", "Olsen", 2019]
Thêm phương thức
Thí dụ
Thêm tham số Person
0 và vượt qua đúng năm khi tạo đối tượng:
def __init__[self, fname, lname]:
super[].__init__[fname, lname]
Hãy tự mình thử »
Bằng cách sử dụng hàm
class UnitMeta[type]:
def __init__[self, *args]:
super[UnitMeta, self].__init__[*args]
for superclass in self.__mro__:
for k,v in vars[superclass].items[]:
if isinstance[v, [list, dict, ]]:
setattr[self, k, type[v][v]]
class Unit[object]:
__metaclass__ = UnitMeta
listvalue = [10]
class Archer[Unit]:
pass
4, bạn không phải sử dụng tên của phần tử cha, nó sẽ tự động kế thừa các phương thức và thuộc tính từ cha mẹ của nó.Thêm thuộc tính
Thí dụ
Thêm một thuộc tính được gọi là
class UnitMeta[type]:
def __init__[self, *args]:
super[UnitMeta, self].__init__[*args]
for superclass in self.__mro__:
for k,v in vars[superclass].items[]:
if isinstance[v, [list, dict, ]]:
setattr[self, k, type[v][v]]
class Unit[object]:
__metaclass__ = UnitMeta
listvalue = [10]
class Archer[Unit]:
pass
6 vào lớp Student
: Học sinh lớp [Người]: & NBSP; def __init __ [self, fname, lname]: & nbsp; & nbsp; & nbsp; Super [] .__ init __ [fname, lname] & nbsp; & nbsp; & nbsp; Tự.gradyyear = 2019
def __init__[self, fname, lname]:
super[].__init__[fname, lname]
self.graduationyear = 2019
Hãy tự mình thử »
Trong ví dụ dưới đây, năm
class UnitMeta[type]:
def __init__[self, *args]:
super[UnitMeta, self].__init__[*args]
for superclass in self.__mro__:
for k,v in vars[superclass].items[]:
if isinstance[v, [list, dict, ]]:
setattr[self, k, type[v][v]]
class Unit[object]:
__metaclass__ = UnitMeta
listvalue = [10]
class Archer[Unit]:
pass
8 phải là một biến và được chuyển vào lớp Student
khi tạo các đối tượng học sinh. Để làm như vậy, hãy thêm một tham số khác trong hàm __init __ []:Thí dụ
Thêm một thuộc tính được gọi là
class UnitMeta[type]:
def __init__[self, *args]:
super[UnitMeta, self].__init__[*args]
for superclass in self.__mro__:
for k,v in vars[superclass].items[]:
if isinstance[v, [list, dict, ]]:
setattr[self, k, type[v][v]]
class Unit[object]:
__metaclass__ = UnitMeta
listvalue = [10]
class Archer[Unit]:
pass
6 vào lớp Student
: Học sinh lớp [Người]: & NBSP; def __init __ [self, fname, lname]: & nbsp; & nbsp; & nbsp; Super [] .__ init __ [fname, lname] & nbsp; & nbsp; & nbsp; Tự.gradyyear = 2019
def __init__[self, fname, lname, year]:
super[].__init__[fname, lname]
self.graduationyear = year
Trong ví dụ dưới đây, năm
class UnitMeta[type]:
def __init__[self, *args]:
super[UnitMeta, self].__init__[*args]
for superclass in self.__mro__:
for k,v in vars[superclass].items[]:
if isinstance[v, [list, dict, ]]:
setattr[self, k, type[v][v]]
class Unit[object]:
__metaclass__ = UnitMeta
listvalue = [10]
class Archer[Unit]:
pass
8 phải là một biến và được chuyển vào lớp Student
khi tạo các đối tượng học sinh. Để làm như vậy, hãy thêm một tham số khác trong hàm __init __ []:Hãy tự mình thử »
Thêm tham số Person
0 và vượt qua đúng năm khi tạo đối tượng:
Thí dụ
Thêm một thuộc tính được gọi là
class UnitMeta[type]:
def __init__[self, *args]:
super[UnitMeta, self].__init__[*args]
for superclass in self.__mro__:
for k,v in vars[superclass].items[]:
if isinstance[v, [list, dict, ]]:
setattr[self, k, type[v][v]]
class Unit[object]:
__metaclass__ = UnitMeta
listvalue = [10]
class Archer[Unit]:
pass
6 vào lớp Student
: Học sinh lớp [Người]: & NBSP; def __init __ [self, fname, lname]: & nbsp; & nbsp; & nbsp; Super [] .__ init __ [fname, lname] & nbsp; & nbsp; & nbsp; Tự.gradyyear = 2019
def __init__[self, fname, lname, year]:
super[].__init__[fname, lname]
self.graduationyear = year
Trong ví dụ dưới đây, năm
class UnitMeta[type]:
def __init__[self, *args]:
super[UnitMeta, self].__init__[*args]
for superclass in self.__mro__:
for k,v in vars[superclass].items[]:
if isinstance[v, [list, dict, ]]:
setattr[self, k, type[v][v]]
class Unit[object]:
__metaclass__ = UnitMeta
listvalue = [10]
class Archer[Unit]:
pass
8 phải là một biến và được chuyển vào lớp Student
khi tạo các đối tượng học sinh. Để làm như vậy, hãy thêm một tham số khác trong hàm __init __ []:print["Welcome", self.firstname, self.lastname, "to the class of", self.graduationyear]
Hãy tự mình thử »
Thêm tham số Person
0 và vượt qua đúng năm khi tạo đối tượng:
Học sinh lớp [Người]: & NBSP; def __init __ [tự, fname, lname, năm]: & nbsp; & nbsp; & nbsp; Super [] .__ init __ [fname, lname] & nbsp; & nbsp; & nbsp; Tự. Tốt nghiệp = năm
Exercise:
X = Sinh viên ["Mike", "Olsen", 2019]
Thêm phương thức