Hướng dẫn are class attributes inherited in python? - các thuộc tính lớp có được kế thừa trong python không?

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 firstnamelastname 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ố Person0 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ố Person0 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à Person1 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ố Person0 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à Person1 vào lớp Student:

Thí dụ

Thêm tham số Person0 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ố Person0 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ố Person0 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ố Person0 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



Thêm một phương thức gọi là Person1 vào lớp Student:

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ó.. If you edit an attribute on the product class where it was originally defined, the changes propagate to all member subclasses. The attribute definition is uniform for all subclasses that inherit it.

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.the superclass should always be object , which is the root of all classes in Python.