2013-02-20 38 views
12

Tôi khá mới sử dụng Python như là OOP. Tôi đến từ một nền Java. Làm thế nào bạn sẽ viết một javabean tương đương trong python? Về cơ bản, tôi cần một lớp học:Tương đương JavaBean trong Python

  1. Thực hiện tuần tự.
  2. Có getter và setter -> properties tin
  3. giả constructor

Bất kỳ đầu vào? Tôi đang tìm một mã mẫu!

+0

Cảm ơn tất cả mọi người. Giải quyết truy vấn của tôi ở đây. – stealthspy

Trả lời

21

Bạn không, vì Python is not Java. Nhiều khả năng bạn chỉ nên viết một lớp ít tầm thường hơn, xây dựng một namedtuple, chuyển một từ điển, hoặc một cái gì đó tương tự. Nhưng để trả lời câu hỏi:

  1. Không phải là "triển khai giao diện" có ý nghĩa trong Python (tốt, trong một số trường hợp và trường hợp sử dụng nâng cao, nhưng không có ở đây). Các mô-đun tuần tự hóa, chẳng hạn như pickle, hoạt động mà không cần triển khai hoặc kế thừa bất kỳ điều gì đặc biệt (bạn có thể tùy chỉnh quy trình theo những cách khác, nhưng bạn hầu như không bao giờ cần).
  2. You don't write getters and setters. Bạn chỉ sử dụng các thuộc tính công khai. Nếu sau này bạn yêu cầu bộ khởi động/thiết lập nontrivial, bạn có thể biến nó thành một property một cách minh bạch.
  3. Không cần một hàm tạo giả, trừ khi bạn muốn tạo thuộc tính và đặt giá trị mặc định cho chúng. Nhưng đó có thể là một ý tưởng tồi (đối với một lớp bean-ish), vì không gán giá trị cho các thuộc tính đó rất có thể là một lỗi và không rõ ràng ngay cả khi nó không phải là. Vì vậy, chỉ cần để Python bắt những lỗi đó cho bạn (nó tăng AttributeError khi một thuộc tính không tồn tại được truy cập).
+5

+1: Tôi vừa đề cập đến bài viết đó ("Python không phải là Java"). –

+0

Lol, Chỉ cần đăng liên kết tới bài viết ... – flaviotruzzi

+1

Cảm ơn. Tôi đã thử Python và mã của tôi là một nửa kích thước. Cảm ơn! Tôi chỉ tìm thấy một ngôn ngữ tuyệt vời. Tôi đã theo một bong bóng mà Java đã tốt hơn rất nhiều! – stealthspy

3
  1. Bạn có thể tuần tự hóa hầu hết đối tượng qua mô-đun pickle;
  2. Không có những thứ như các thuộc tính riêng trong Python (xem thêm:
  3. Các lớp không xác định hàm tạo sẽ sử dụng mặc định (theo thứ tự độ phân giải phương pháp).

Ví dụ cho constructor 'chuỗi':

>>> class A(object): 
...  def __init__(self): 
...   print("A") 
...  
... 
>>> class B(A): pass # has no explicit contructor 
... 
>>> b = B() 
A 
>>> 

Và - như @delnan viết - bạn có thể muốn đọc: http://dirtsimple.org/2004/12/python-is-not-java.html - Java và Python có khá khác nhau nền văn hóa, phải mất một thời gian để đi sâu vào (và đánh giá cao) cả hai.

Ngoài ra, sau khi viết một số mã, nó có thể hữu ích để so sánh nó với các thành ngữ thông thường, như được liệt kê ở đây (chắc chắn tôi học được rất nhiều theo cách này):

+0

Cảm ơn rất nhiều vì phản hồi. – stealthspy

1

Thực hiện tuần tự.

Chọn định dạng yêu thích của bạn và viết một chức năng sẽ sắp xếp theo thứ tự cho bạn. JSON, Pickle, YAML, bất kỳ công việc nào. Chỉ cần quyết định!

Có getter và setter -> properties tin

Chúng tôi không làm điều đó ở đây, đó là những thuộc tính của ngôn ngữ nô lệ, chúng ta đều trưởng thành trong ngôn ngữ này.

constructor giả

Một lần nữa không phải cái gì chúng tôi thực sự lo lắng vì nhà xây dựng của chúng tôi là một chút thông minh hơn các ngôn ngữ khác.Vì vậy, bạn chỉ có thể xác định một __init__ và nó có thể làm tất cả khởi tạo của bạn, nếu bạn phải sau đó viết một nhà máy hoặc phân lớp nó.

+1

Tôi muốn nói bằng tay viết mã để chuyển đổi các đối tượng đến và từ JSON/YAML/etc. không cần thiết cũng không được khuyến khích trong hầu hết các trường hợp. – delnan

+0

Và khi 'pickle' không nên được sử dụng bởi vì nó không an toàn hoặc chậm, hoặc nó không thể xử lý đối tượng lạ mắt của bạn? –

+0

Đó là một trong những trường hợp mà các lựa chọn thay thế là tốt ;-) Mặc dù tôi hy vọng rằng trong nhiều trường hợp như vậy, có một giải pháp hiện có để tự động hóa điều này, vì vậy bạn vẫn không cần viết mã theo cách thủ công. Ngoài ra, trong trường hợp cuối cùng, bạn luôn có thể sử dụng 'copyreg' hoặc' __reduce__' để tùy chỉnh cách dưa chuột xử lý đối tượng ưa thích của bạn. – delnan

0

Như đã chỉ bởi miku:

  1. Đối tượng có thể được đăng bởi module picke, nhưng không có một giao diện được thực hiện, Python không phải là Java.

  2. Không có thuộc tính riêng trong python, thường là mọi người sử dụng thanh (gạch dưới) có nghĩa là thuộc tính riêng tư, nhưng chúng có thể được truy cập từ thế giới bên ngoài. Getters và setters là lãng phí thời gian của cả CPU và lập trình viên.

  3. Không có gì để thêm vào câu trả lời của miku.

về các thuộc tính: Real world example about how to use property feature in python?

tốt văn bản: http://dirtsimple.org/2004/12/python-is-not-java.html

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