2013-12-13 25 views
6

Ok Tôi đã đọc về cách sử dụng trang trí @property trong Python thay vì các phương pháp cụ thể để nhận, thiết lập và xóa. Một số mã ví dụ được hiển thị bên dưới.Tự động thiết lập getter, setter và deleter trong python

class Person(object): 

    def __init__(self): 

     self._firstName = None 
     self._lastName = None 
     self._age = None 

    @property 
    def firstName(self): return self._firstName 
    @firstName.setter 
    def firstName(self, val): self._firstName = val 
    @firstName.deleter 
    def firstName(self): del self._firstName 

    @property 
    def lastName(self): return self._lastName 
    @lastName.setter 
    def lastName(self, val): self._lastName = val 
    @lastName.deleter 
    def lastName(self): del self._lastName 

    @property 
    def age(self): return self._age 
    @age.setter 
    def age(self, val): self._age = val 
    @age.deleter 
    def age(self): del self._age 

Peter = Person() 

Peter.firstName = 'Peter' 
Peter.lastName = 'Smith' 
Peter.age = 21 

print ' '.join([Peter.firstName, Peter.lastName]) 

Như bạn có thể thấy, phần lớn mã trong ví dụ được dành để xác định phương pháp.

Câu hỏi của tôi là liệu có cách nào để tự động chỉ định trình khởi động, trình thiết lập và deleter cho từng biến của tôi không? Trong mã thực tế của tôi, tôi có nhiều biến hơn và có vẻ như rất nhiều mã lặp lại thiết lập mỗi phương thức.

Tôi nhận ra rằng đối với những trường hợp đơn giản, điều này có thể không thực sự cần thiết tuy nhiên tôi muốn viết mã các phương thức ngay bây giờ trong trường hợp tôi quyết định tăng độ phức tạp của lớp.

+3

* "tuy nhiên tôi muốn viết mã các phương pháp ngay bây giờ trong trường hợp tôi quyết định tăng độ phức tạp của lớp." * - tại sao bạn không thêm chúng khi cần? Chỉ thực hiện những gì bạn cần * now * và refactor khi mã của bạn phát triển. Mọi thứ bạn thêm ngay bây giờ để hỗ trợ tiện ích mở rộng hoặc tính năng có thể xảy ra hoặc có thể không xảy ra chỉ là tiếng ồn. –

Trả lời

3

Hãy đơn giản.

Nếu bạn có các chức năng như vậy, chỉ cần sử dụng biến có thể truy cập công khai. Đó là:

class Person(object): 
    def __init__(self): 
     self.firstName = None 
     self.lastName = None 
     self.age = None 

hoàn toàn ổn. Một cách tiếp cận tốt hơn cho việc sử dụng là để yêu cầu dữ liệu như là một phần của các nhà xây dựng, như sau:

class Person(object): 
    def __init__(self, firstName, lastName, age): 
     self.firstName = firstName 
     self.lastName = lastName 
     self.age = None 

person = Person('Peter', 'Smith', 21) 

Nếu bạn lo lắng về mà tên là đó, bạn luôn có thể được cụ thể:

person = Person(firstName='Peter', lastName='Smith', age=21) 

Trong tương lai, nếu bạn cần làm cho nó phức tạp hơn, bạn có thể thêm getters/setters nếu cần.

xem xét khác là cho các nhà xây dựng, bạn có thể tạo một hàm chuỗi chuyển đổi trên Person đối tượng:

def __str__(self): 
    return ' '.join([self.firstName, self.lastName]) 

này sau đó cho phép bạn sử dụng nó như:

person = Person(firstName='Peter', lastName='Smith', age=21) 
print(person) 

vì vậy bạn don 't cần phải biết làm thế nào nó được thực hiện trong nội bộ.

Một lưu ý khác là tên Trung Quốc/Nhật Bản đặt tên họ trước, mọi người có thể có nhiều họ (đặc biệt ở Tây Ban Nha) và có thể có tên đệm.

2

Toàn bộ điểm của trình trang trí thuộc tính là để bạn không cần phải xác định nó ngay từ đầu. Truy cập trực tiếp một thuộc tính giống hệt cú pháp khi truy cập một thuộc tính thông qua một thuộc tính. Vì vậy, bạn nên để nó hoàn toàn cho đến khi bạn thực sự có logic phức tạp, và chỉ sau đó thay đổi thành thuộc tính.

0

Định nghĩa thủ công và định nghĩa deleter là cách rõ ràng để nói "Tôi đã dành rất nhiều thời gian để tạo giao diện này và bạn được tự do đặt, xóa và nhận thuộc tính này mà không có bất kỳ mối lo ngại nào về việc vi phạm".

Nếu không, bạn có thể chỉ cần sử dụng biến mẫu mà không có trình trang trí thuộc tính.

def __init__(self): 

    self.firstName = None 
    self.lastName = None 
    self.age = None 

Một lưu ý phụ, bạn có thể muốn xem xét PEP-8 cho quy ước đặt tên biến và tạo mã.

Các vấn đề liên quan