Hướng dẫn python property setter with arguments - trình thiết lập thuộc tính python với các đối số

class MyClass(object):
   def __init__(self, name):
     self.name = name
     self._prof = None
     self._ischanged = False

   @property 
   def prof(self):
     if not self._prof:
        self._prof = "Sample Prof"
     return self._prof

   @prof.setter
   def prof(self, value, anothervalue):
      pass

Ở đây bạn có thể nhận được giáo sư bằng cách sử dụng:

myclass = MyClass("sam")

myclass.prof

Nhưng tôi không thể tìm cách đặt các giá trị của Giáo sư.

Trong mã trên, làm thế nào tôi sẽ chuyển hai giá trị cho prof?

Hướng dẫn python property setter with arguments - trình thiết lập thuộc tính python với các đối số

James Hopkin

Huy hiệu vàng 13,6K11 gold badge41 silver badges70 bronze badges

Đã hỏi ngày 7 tháng 7 năm 2016 lúc 20:00Jul 7, 2016 at 20:00

paris_serviolaparis_serviolaparis_serviola

3211 Huy hiệu vàng6 Huy hiệu bạc19 Huy hiệu đồng1 gold badge6 silver badges19 bronze badges

Bạn không thể chuyển hai giá trị cho một setter. Khi bạn làm:

instance.property = whatever

Python gọi người thiết lập với

instance.property = whatever
6 (như
instance.property = whatever
7) và
instance.property = whatever
8 là đối số.


Bạn có thể vượt qua 2-Tuple mặc dù:

myclass.prof = ('one', 'two')

Trong trường hợp này, setter sẽ được thông qua 2-tuple

instance.property = whatever
9 làm giá trị. Nếu đó không phải là những gì bạn muốn, bạn nên sử dụng phương thức vani để đặt các giá trị. ví dụ.:

myclass.set_prof(value1, value2)

Đã trả lời ngày 7 tháng 7 năm 2016 lúc 20:02Jul 7, 2016 at 20:02

Hướng dẫn python property setter with arguments - trình thiết lập thuộc tính python với các đối số

4

  • Tài liệu »
  • setter
  • Chỉnh sửa trên GitHub

Sự mô tả¶

Ghi đè cơ chế truy cập thuộc tính.

Cú pháp

property.getter(method)

Phương pháp phương pháp để trang trí.

Nhận xét bài

Một đối tượng thuộc tính có các phương thức Getter, Setter và Deleter có thể sử dụng làm người trang trí tạo ra một bản sao của tài sản với hàm excessor tương ứng được đặt thành hàm được trang trí. Điều này được giải thích tốt nhất với một ví dụ:

class C(object):
    def __init__(self):
        self._x = None

    @property
    def x(self):
        """I'm the 'x' property."""
        return self._x

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

    @x.deleter
    def x(self):
        del self._x

Mã này hoàn toàn tương đương với ví dụ đầu tiên. Hãy chắc chắn đặt cho các chức năng bổ sung cùng tên với thuộc tính gốc (x trong trường hợp này.)

Thuộc tính được trả về cũng có các thuộc tính FGET, FSET và FDEL tương ứng với các đối số của hàm tạo.

Thí dụ¶

>>> foo
3.6055512754639896

Lập trình Python cung cấp cho chúng tôi một trình trang trí

myclass.prof = ('one', 'two')
0 tích hợp, giúp việc sử dụng getter và setters dễ dàng hơn nhiều trong lập trình hướng đối tượng.

Trước khi đi sâu vào chi tiết về trang trí

myclass.prof = ('one', 'two')
0 là gì, trước tiên chúng ta hãy xây dựng trực giác về lý do tại sao nó sẽ cần thiết ngay từ đầu.


Lớp không có getters và setters

Chúng ta hãy giả sử rằng chúng ta quyết định tạo ra một lớp lưu trữ nhiệt độ theo độ C. Nó cũng sẽ thực hiện một phương pháp để chuyển đổi nhiệt độ thành độ Fahrenheit. Một cách để làm điều này là như sau:

class Celsius:
    def __init__(self, temperature = 0):
        self.temperature = temperature

    def to_fahrenheit(self):
        return (self.temperature * 1.8) + 32

Chúng ta có thể tạo các đối tượng ra khỏi lớp này và thao tác thuộc tính

myclass.prof = ('one', 'two')
2 như chúng ta muốn:

# Basic method of setting and getting attributes in Python
class Celsius:
    def __init__(self, temperature=0):
        self.temperature = temperature

    def to_fahrenheit(self):
        return (self.temperature * 1.8) + 32


# Create a new object
human = Celsius()

# Set the temperature
human.temperature = 37

# Get the temperature attribute
print(human.temperature)

# Get the to_fahrenheit method
print(human.to_fahrenheit())

Đầu ra

37
98.60000000000001

Các vị trí thập phân bổ sung khi chuyển đổi thành Fahrenheit là do lỗi số học điểm nổi. Để tìm hiểu thêm, hãy truy cập lỗi số học của Python Point.

Bất cứ khi nào chúng tôi gán hoặc truy xuất bất kỳ thuộc tính đối tượng nào như

myclass.prof = ('one', 'two')
2 Như được hiển thị ở trên, Python tìm kiếm nó trong thuộc tính từ điển
myclass.prof = ('one', 'two')
4 tích hợp của đối tượng.

myclass = MyClass("sam")

myclass.prof
0

Do đó,

myclass.prof = ('one', 'two')
5 trong nội bộ trở thành
myclass.prof = ('one', 'two')
6.


Sử dụng getters và setters

Giả sử chúng ta muốn mở rộng khả năng sử dụng của lớp C, được xác định ở trên. Chúng tôi biết rằng nhiệt độ của bất kỳ vật thể nào cũng không thể đạt dưới -273,15 độ C.

Hãy cập nhật mã của chúng tôi để thực hiện ràng buộc giá trị này.

Một giải pháp rõ ràng cho các hạn chế trên sẽ là ẩn thuộc tính

myclass.prof = ('one', 'two')
2 (làm cho nó riêng tư) và xác định các phương thức Getter và Setter mới để thao tác nó. Điều này có thể được thực hiện như sau:

myclass = MyClass("sam")

myclass.prof
1

Như chúng ta có thể thấy, phương pháp trên giới thiệu hai phương thức

myclass.prof = ('one', 'two')
8 và
myclass.prof = ('one', 'two')
9 mới.

Hơn nữa,

myclass.prof = ('one', 'two')
2 đã được thay thế bằng
myclass.set_prof(value1, value2)
1. Một dấu gạch dưới
myclass.set_prof(value1, value2)
2 lúc đầu được sử dụng để biểu thị các biến riêng trong Python.


Bây giờ, hãy sử dụng triển khai này:

myclass = MyClass("sam")

myclass.prof
2

Đầu ra

myclass = MyClass("sam")

myclass.prof
3

Các vị trí thập phân bổ sung khi chuyển đổi thành Fahrenheit là do lỗi số học điểm nổi. Để tìm hiểu thêm, hãy truy cập lỗi số học của Python Point.

Bất cứ khi nào chúng tôi gán hoặc truy xuất bất kỳ thuộc tính đối tượng nào như

myclass.prof = ('one', 'two')
2 Như được hiển thị ở trên, Python tìm kiếm nó trong thuộc tính từ điển
myclass.prof = ('one', 'two')
4 tích hợp của đối tượng.
: The private variables don't actually exist in Python. There are simply norms to be followed. The language itself doesn't apply any restrictions.

myclass = MyClass("sam")

myclass.prof
4

Do đó,

myclass.prof = ('one', 'two')
5 trong nội bộ trở thành
myclass.prof = ('one', 'two')
6.

Sử dụng getters và setters

Giả sử chúng ta muốn mở rộng khả năng sử dụng của lớp C, được xác định ở trên. Chúng tôi biết rằng nhiệt độ của bất kỳ vật thể nào cũng không thể đạt dưới -273,15 độ C.


Hãy cập nhật mã của chúng tôi để thực hiện ràng buộc giá trị này.

Một giải pháp rõ ràng cho các hạn chế trên sẽ là ẩn thuộc tính

myclass.prof = ('one', 'two')
2 (làm cho nó riêng tư) và xác định các phương thức Getter và Setter mới để thao tác nó. Điều này có thể được thực hiện như sau:

myclass = MyClass("sam")

myclass.prof
5

Như chúng ta có thể thấy, phương pháp trên giới thiệu hai phương thức

myclass.prof = ('one', 'two')
8 và
myclass.prof = ('one', 'two')
9 mới.

Hơn nữa,

myclass.prof = ('one', 'two')
2 đã được thay thế bằng
myclass.set_prof(value1, value2)
1. Một dấu gạch dưới
myclass.set_prof(value1, value2)
2 lúc đầu được sử dụng để biểu thị các biến riêng trong Python.

Bây giờ, hãy sử dụng triển khai này:

myclass = MyClass("sam")

myclass.prof
6

Đầu ra

myclass = MyClass("sam")

myclass.prof
7

Các vị trí thập phân bổ sung khi chuyển đổi thành Fahrenheit là do lỗi số học điểm nổi. Để tìm hiểu thêm, hãy truy cập lỗi số học của Python Point.

Bất cứ khi nào chúng tôi gán hoặc truy xuất bất kỳ thuộc tính đối tượng nào như

myclass.prof = ('one', 'two')
2 Như được hiển thị ở trên, Python tìm kiếm nó trong thuộc tính từ điển
myclass.prof = ('one', 'two')
4 tích hợp của đối tượng.

myclass = MyClass("sam")

myclass.prof
8

Do đó,

myclass.prof = ('one', 'two')
5 trong nội bộ trở thành
myclass.prof = ('one', 'two')
6.

Sử dụng getters và setters

Giả sử chúng ta muốn mở rộng khả năng sử dụng của lớp C, được xác định ở trên. Chúng tôi biết rằng nhiệt độ của bất kỳ vật thể nào cũng không thể đạt dưới -273,15 độ C.

myclass = MyClass("sam")

myclass.prof
9

Hãy cập nhật mã của chúng tôi để thực hiện ràng buộc giá trị này.

Một giải pháp rõ ràng cho các hạn chế trên sẽ là ẩn thuộc tính

myclass.prof = ('one', 'two')
2 (làm cho nó riêng tư) và xác định các phương thức Getter và Setter mới để thao tác nó. Điều này có thể được thực hiện như sau:: The actual temperature value is stored in the private
myclass.set_prof(value1, value2)
1 variable. The
myclass.prof = ('one', 'two')
2 attribute is a property object which provides an interface to this private variable.


Như chúng ta có thể thấy, phương pháp trên giới thiệu hai phương thức myclass.prof = ('one', 'two') 8 và myclass.prof = ('one', 'two') 9 mới.

Hơn nữa,

myclass.prof = ('one', 'two')
2 đã được thay thế bằng
myclass.set_prof(value1, value2)
1. Một dấu gạch dưới
myclass.set_prof(value1, value2)
2 lúc đầu được sử dụng để biểu thị các biến riêng trong Python.

instance.property = whatever
0

where,

  • Bây giờ, hãy sử dụng triển khai này:
  • class Celsius:
        def __init__(self, temperature = 0):
            self.temperature = temperature
    
        def to_fahrenheit(self):
            return (self.temperature * 1.8) + 32
    2 là chức năng để đặt giá trị của thuộc tính
  • class Celsius:
        def __init__(self, temperature = 0):
            self.temperature = temperature
    
        def to_fahrenheit(self):
            return (self.temperature * 1.8) + 32
    3 là chức năng xóa thuộc tính
  • class Celsius:
        def __init__(self, temperature = 0):
            self.temperature = temperature
    
        def to_fahrenheit(self):
            return (self.temperature * 1.8) + 32
    4 là một chuỗi (như một bình luận)

Như được thấy từ việc thực hiện, các đối số chức năng này là tùy chọn. Vì vậy, một đối tượng thuộc tính có thể chỉ đơn giản là được tạo như sau.

instance.property = whatever
1

Một đối tượng thuộc tính có ba phương thức,

class Celsius:
    def __init__(self, temperature = 0):
        self.temperature = temperature

    def to_fahrenheit(self):
        return (self.temperature * 1.8) + 32
5,
class Celsius:
    def __init__(self, temperature = 0):
        self.temperature = temperature

    def to_fahrenheit(self):
        return (self.temperature * 1.8) + 32
6 và
class Celsius:
    def __init__(self, temperature = 0):
        self.temperature = temperature

    def to_fahrenheit(self):
        return (self.temperature * 1.8) + 32
7 để chỉ định
class Celsius:
    def __init__(self, temperature = 0):
        self.temperature = temperature

    def to_fahrenheit(self):
        return (self.temperature * 1.8) + 32
1,
class Celsius:
    def __init__(self, temperature = 0):
        self.temperature = temperature

    def to_fahrenheit(self):
        return (self.temperature * 1.8) + 32
2 và
class Celsius:
    def __init__(self, temperature = 0):
        self.temperature = temperature

    def to_fahrenheit(self):
        return (self.temperature * 1.8) + 32
3 ở điểm sau. Điều này có nghĩa là, dòng:

instance.property = whatever
2

có thể bị phá vỡ như:

instance.property = whatever
3

Hai đoạn mã này là tương đương.

Các lập trình viên quen thuộc với các nhà trang trí Python có thể nhận ra rằng cấu trúc trên có thể được thực hiện như là nhà trang trí.

Chúng tôi thậm chí không thể xác định tên

class C(object):
    def __init__(self):
        self._x = None

    @property
    def x(self):
        """I'm the 'x' property."""
        return self._x

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

    @x.deleter
    def x(self):
        del self._x
3 và
class C(object):
    def __init__(self):
        self._x = None

    @property
    def x(self):
        """I'm the 'x' property."""
        return self._x

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

    @x.deleter
    def x(self):
        del self._x
4 vì chúng không cần thiết và gây ô nhiễm không gian tên lớp.

Đối với điều này, chúng tôi sử dụng lại tên

myclass.prof = ('one', 'two')
2 trong khi xác định các hàm getter và setter của chúng tôi. Hãy xem cách thực hiện điều này như một người trang trí:

instance.property = whatever
4

Đầu ra

instance.property = whatever
5

Việc thực hiện trên là đơn giản và hiệu quả. Đó là cách khuyến nghị để sử dụng

myclass.set_prof(value1, value2)
8.

@Property có nghĩa là gì trong Python?

@Property là một công cụ trang trí tích hợp cho hàm tài sản () trong Python. Nó được sử dụng để cung cấp chức năng "đặc biệt" cho một số phương pháp nhất định để làm cho chúng hoạt động như getters, setters hoặc deleter khi chúng ta xác định các thuộc tính trong một lớp.a built-in decorator for the property() function in Python. It is used to give "special" functionality to certain methods to make them act as getters, setters, or deleters when we define properties in a class.

Cách sử dụng getters và setters pythonic nhất là gì?

Getters và setters trong Python thường được sử dụng khi: chúng tôi sử dụng getters & setters để thêm logic xác thực xung quanh việc nhận và đặt giá trị. Để tránh truy cập trực tiếp của trường lớp, tức là các biến riêng tư không thể được truy cập trực tiếp hoặc sửa đổi bởi người dùng bên ngoài.to add validation logic around getting and setting a value. To avoid direct access of a class field i.e. private variables cannot be accessed directly or modified by external user.

Tài sản và setter trong Python là gì?

Getters: Đây là các phương pháp được sử dụng trong lập trình hướng đối tượng (OOPS) giúp truy cập các thuộc tính riêng tư từ một lớp.Setters: Đây là các phương thức được sử dụng trong tính năng OOPS giúp đặt giá trị thành các thuộc tính riêng tư trong một lớp.

Làm thế nào để bạn truy cập các thuộc tính của một đối tượng trong Python?

getAttr () - Hàm này được sử dụng để truy cập thuộc tính của đối tượng.HasAttr () - Hàm này được sử dụng để kiểm tra xem thuộc tính có tồn tại hay không.setAttr () - Hàm này được sử dụng để đặt thuộc tính.Nếu thuộc tính không tồn tại, thì nó sẽ được tạo ra. – This function is used to access the attribute of object. hasattr() – This function is used to check if an attribute exist or not. setattr() – This function is used to set an attribute. If the attribute does not exist, then it would be created.