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

Tôi có một lớp cơ sở với một thuộc tính (phương pháp GET) tôi muốn ghi đè lên lớp con. Suy nghĩ đầu tiên của tôi là một cái gì đó như:

class Foo(object):
    def _get_age(self):
        return 11

    age = property(_get_age)


class Bar(Foo):
    def _get_age(self):
        return 44

Điều này không hoạt động (thanh phân lớp con.age trả về 11). Tôi đã tìm thấy một giải pháp với biểu thức Lambda hoạt động:

age = property(lambda self: self._get_age())

Vì vậy, đây có phải là giải pháp phù hợp để sử dụng các thuộc tính và ghi đè chúng theo một lớp con, hoặc có những cách ưa thích khác để làm điều này?

Đã hỏi ngày 26 tháng 10 năm 2008 lúc 2:49Oct 26, 2008 at 2:49

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

Peter Hoffmannpeter HoffmannPeter Hoffmann

54.2K15 Huy hiệu vàng74 Huy hiệu bạc58 Huy hiệu đồng15 gold badges74 silver badges58 bronze badges

Tôi chỉ đơn giản thích lặp lại

age = property(lambda self: self._get_age())
7 cũng như bạn sẽ lặp lại trình trang trí
age = property(lambda self: self._get_age())
8 khi ghi đè một phương thức lớp.

Mặc dù điều này có vẻ rất dài dòng, ít nhất là đối với các tiêu chuẩn Python, bạn có thể nhận thấy:

1) Đối với các thuộc tính chỉ đọc,

age = property(lambda self: self._get_age())
9 có thể được sử dụng làm người trang trí:

class Foo(object):
    @property
    def age(self):
        return 11

class Bar(Foo):
    @property
    def age(self):
        return 44

2) Trong Python 2.6, các thuộc tính đã phát triển một cặp phương thức

class Foo(object):
    @property
    def age(self):
        return 11

class Bar(Foo):
    @property
    def age(self):
        return 44
0 và
class Foo(object):
    @property
    def age(self):
        return 11

class Bar(Foo):
    @property
    def age(self):
        return 44
1 có thể được sử dụng để áp dụng cho các thuộc tính chung, phím tắt đã có sẵn cho các loại chỉ đọc:

class C(object):
    @property
    def x(self):
        return self._x

    @x.setter
    def x(self, value):
        self._x = value

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

Neil g

31.2K39 Huy hiệu vàng150 Huy hiệu bạc251 Huy hiệu Đồng39 gold badges150 silver badges251 bronze badges

Đã trả lời ngày 26 tháng 10 năm 2008 lúc 10:50Oct 26, 2008 at 10:50

Piropiropiro

12.9k5 Huy hiệu vàng34 Huy hiệu bạc35 Huy hiệu Đồng5 gold badges34 silver badges35 bronze badges

3

Tôi không đồng ý rằng câu trả lời đã chọn là cách lý tưởng để cho phép ghi đè các phương thức thuộc tính. Nếu bạn mong đợi các getters và setters sẽ bị ghi đè, thì bạn có thể sử dụng Lambda để cung cấp quyền truy cập vào bản thân, với một cái gì đó như

class Foo(object):
    @property
    def age(self):
        return 11

class Bar(Foo):
    @property
    def age(self):
        return 44
2.

Điều này hoạt động (ít nhất) cho các phiên bản Python 2.4 đến 3,6.

Nếu bất cứ ai biết cách làm điều này bằng cách sử dụng thuộc tính làm người trang trí thay vì gọi là một cuộc gọi trực tiếp (), tôi muốn nghe nó!

Example:

class Foo(object):
    def _get_meow(self):
        return self._meow + ' from a Foo'
    def _set_meow(self, value):
        self._meow = value
    meow = property(fget=lambda self: self._get_meow(),
                    fset=lambda self, value: self._set_meow(value))

Bằng cách này, có thể dễ dàng thực hiện ghi đè:

class Bar(Foo):
    def _get_meow(self):
        return super(Bar, self)._get_meow() + ', altered by a Bar'

để có thể:

>>> foo = Foo()
>>> bar = Bar()
>>> foo.meow, bar.meow = "meow", "meow"
>>> foo.meow
"meow from a Foo"
>>> bar.meow
"meow from a Foo, altered by a Bar"

Tôi phát hiện ra điều này trên Geek tại Play.

Đã trả lời ngày 16 tháng 1 năm 2013 lúc 0:55Jan 16, 2013 at 0:55

Ông BMR. BMr. B

2.4251 Huy hiệu vàng24 Huy hiệu bạc24 Huy hiệu đồng1 gold badge24 silver badges24 bronze badges

1

Một cách khác để làm điều đó, mà không phải tạo bất kỳ lớp bổ sung nào. Tôi đã thêm một phương thức SET để hiển thị những gì bạn làm nếu bạn chỉ ghi đè một trong hai:

class Foo(object):
    def _get_age(self):
        return 11

    def _set_age(self, age):
        self._age = age

    age = property(_get_age, _set_age)


class Bar(Foo):
    def _get_age(self):
        return 44

    age = property(_get_age, Foo._set_age)

Đây là một ví dụ khá giả tạo, nhưng bạn nên có ý tưởng.

Đã trả lời ngày 14 tháng 11 năm 2008 lúc 22:52Nov 14, 2008 at 22:52

Kamil Kisielkamil KisielKamil Kisiel

19.1k11 Huy hiệu vàng46 Huy hiệu bạc54 Huy hiệu đồng11 gold badges46 silver badges54 bronze badges

3

Vâng, đây là cách để làm điều đó; Tuyên bố thuộc tính thực thi tại thời điểm định nghĩa của lớp cha được thực thi, điều đó có nghĩa là nó chỉ có thể "xem" các phiên bản của các phương thức tồn tại trên lớp cha. Vì vậy, khi bạn xác định lại một hoặc nhiều trong số các phương thức đó trên lớp trẻ, bạn cần khai báo lại thuộc tính bằng phiên bản (các) phương thức của lớp con.

Đã trả lời ngày 26 tháng 10 năm 2008 lúc 3:07Oct 26, 2008 at 3:07

James Bennettjames BennettJames Bennett

10,7K4 Huy hiệu vàng35 Huy hiệu bạc24 Huy hiệu đồng4 gold badges35 silver badges24 bronze badges

Một cách giải quyết khả dĩ có thể trông giống như:

class Foo:
    def __init__(self, age):
        self.age = age

    @property
    def age(self):
        print('Foo: getting age')
        return self._age

    @age.setter
    def age(self, value):
        print('Foo: setting age')
        self._age = value


class Bar(Foo):
    def __init__(self, age):
        self.age = age

    @property
    def age(self):
        return super().age

    @age.setter
    def age(self, value):
        super(Bar, Bar).age.__set__(self, value)

if __name__ == '__main__':
    f = Foo(11)
    print(f.age)
    b = Bar(44)
    print(b.age)

Nó in

Foo: setting age
Foo: getting age
11
Foo: setting age
Foo: getting age
44

Có ý tưởng từ "Cookbook Python" của David Beazley & Brian K. Jones. Sử dụng Python 3.5.3 trên Debian GNU/Linux 9.11 (kéo dài)

Đã trả lời ngày 4 tháng 1 năm 2020 lúc 19:45Jan 4, 2020 at 19:45

Tôi đồng ý với giải pháp của bạn, có vẻ như là một phương pháp mẫu trên đường bay. Bài viết này liên quan đến vấn đề của bạn và cung cấp chính xác giải pháp của bạn.

Đã trả lời ngày 26 tháng 10 năm 2008 lúc 3:01Oct 26, 2008 at 3:01

Một cái gì đó như thế này sẽ hoạt động

age = property(lambda self: self._get_age())
0

Đã trả lời ngày 26 tháng 10 năm 2008 lúc 3:17Oct 26, 2008 at 3:17

KozyarchukkozyarchukKozyarchuk

20.2K14 Huy hiệu vàng40 Huy hiệu bạc46 Huy hiệu đồng14 gold badges40 silver badges46 bronze badges

2

Giống như @Mr-B's nhưng với người trang trí.

age = property(lambda self: self._get_age())
1

Bằng cách này, có thể dễ dàng thực hiện ghi đè:

class Bar(Foo):
    def _get_meow(self):
        return super(Bar, self)._get_meow() + ', altered by a Bar'

để có thể:May 20, 2016 at 21:11

Tôi phát hiện ra điều này trên Geek tại Play.

age = property(lambda self: self._get_age())
3

Đã trả lời ngày 16 tháng 1 năm 2013 lúc 0:55Jun 2, 2015 at 15:52

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

Ông BMR. Bandrew pate

2.4251 Huy hiệu vàng24 Huy hiệu bạc24 Huy hiệu đồng33 silver badges23 bronze badges

Một cách khác để làm điều đó, mà không phải tạo bất kỳ lớp bổ sung nào. Tôi đã thêm một phương thức SET để hiển thị những gì bạn làm nếu bạn chỉ ghi đè một trong hai:
For my unterstanding a slightly better variant might be calling the constructer of the superclass.
Resulting in the following code:

age = property(lambda self: self._get_age())
4

Đây là một ví dụ khá giả tạo, nhưng bạn nên có ý tưởng.

Đã trả lời ngày 14 tháng 11 năm 2008 lúc 22:52

Foo: setting age
Foo: getting age
11
Foo: setting age
Foo: getting age
44

Kamil Kisielkamil Kisiel

19.1k11 Huy hiệu vàng46 Huy hiệu bạc54 Huy hiệu đồngMay 16, 2021 at 16:29

age = property(lambda self: self._get_age())
6

Vâng, đây là cách để làm điều đó; Tuyên bố thuộc tính thực thi tại thời điểm định nghĩa của lớp cha được thực thi, điều đó có nghĩa là nó chỉ có thể "xem" các phiên bản của các phương thức tồn tại trên lớp cha. Vì vậy, khi bạn xác định lại một hoặc nhiều trong số các phương thức đó trên lớp trẻ, bạn cần khai báo lại thuộc tính bằng phiên bản (các) phương thức của lớp con.

Đã trả lời ngày 26 tháng 10 năm 2008 lúc 3:07Aug 23, 2019 at 3:51

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

James Bennettjames BennettRobin

10,7K4 Huy hiệu vàng35 Huy hiệu bạc24 Huy hiệu đồng4 bronze badges

Những gì được thừa hưởng trong Python?

Kế thừa trong Python, nó đề cập đến việc xác định một lớp mới với rất ít hoặc không có sửa đổi cho một lớp hiện có. Lớp mới được gọi là lớp dẫn xuất (hoặc trẻ em) và lớp mà nó thừa hưởng được gọi là lớp cơ sở (hoặc cha mẹ).defining a new class with little or no modification to an existing class. The new class is called derived (or child) class and the one from which it inherits is called the base (or parent) class.

Các lớp con có kế thừa các thuộc tính không?

Lớp có thuộc tính và phương thức được kế thừa được gọi là lớp cha.Và lớp kế thừa các thuộc tính từ lớp cha là lớp con.Điều thú vị là, cùng với các thuộc tính và phương pháp di truyền, một lớp con có thể có các thuộc tính và phương pháp riêng.the class that inherits the properties from the parent class is the Child class. The interesting thing is, along with the inherited properties and methods, a child class can have its own properties and methods.

Việc thừa kế nào không được hỗ trợ trong Python?

Trả lời: Không giống như các ngôn ngữ lập trình hướng đối tượng khác như Java, Python hỗ trợ tất cả các loại kế thừa, thậm chí nhiều kế thừa!Và mặc dù C ++ cũng hỗ trợ loại kế thừa này, nhưng nó không có cùng cách tiếp cận tinh vi và được thiết kế tốt như Python.

Tài sản () làm gì trong Python?

Thuộc tính của Python () là cách pythonic để tránh các phương thức getter và setter chính thức trong mã của bạn.Hàm này cho phép bạn biến các thuộc tính lớp thành thuộc tính hoặc thuộc tính được quản lý.Vì thuộc tính () là một hàm tích hợp, bạn có thể sử dụng nó mà không cần nhập bất cứ thứ gì.allows you to turn class attributes into properties or managed attributes. Since property() is a built-in function, you can use it without importing anything.