Trả lời

17

Iain, điều này về cơ bản là một câu hỏi ngữ và là, mặc dù thẻ "ngôn ngữ-agnostic" gắn liền với câu hỏi này, rất ngôn ngữ/môi trường có liên quan.

Đối với các thảo luận thiết kế, biến thuộc tính và biến mẫu có thể được sử dụng thay thế cho nhau, vì ý tưởng là thuộc tính là mục dữ liệu mô tả một đối tượng.

Khi nói về một ngôn ngữ cụ thể, hai ngôn ngữ này có thể khác nhau. Ví dụ, trong C# một thuộc tính thực sự là một hàm trả về một đối tượng, trong khi một biến cá thể là một biến thành viên không tĩnh của một lớp.

+1

+1: Chắc chắn liên quan đến ngôn ngữ. – Powerlord

+0

vâng, java nghèo .... vẫn không có thuộc tính :( –

2

mã ví dụ thực hiện trong C#

public class ClassName 
{ 
    private string variable; 

    public string property 
    { 
     get{ return variable; } 
     set { variable = value; } 
    } 
} 
0

Trong Java, chúng tôi có một cái gọi là JavaBeans Properties, nhưng về cơ bản là một biến mẫu theo một mẫu đặt tên nhất định cho trình lấy và đặt của nó.

0

Khi thêm vào những gì đã được nói, trong ngôn ngữ giống như C#, thuộc tính cơ bản là hàm get và set. Kết quả là, nó có thể có logic tùy chỉnh chạy ngoài việc nhận/thiết lập. Một biến cá thể không thể làm điều này.

1

Có thể đó là do bạn lần đầu tiên đến từ C++ phải không ?! Trong những ngày học của tôi, tôi đã có các giáo sư nói rằng các đặc tính của lớp học hoặc lớp học luôn luôn là lúc. Kể từ khi tôi chuyển sang thế giới Java C#, tôi bắt đầu nghe về các thành viên. Thành viên nhóm, thành viên cá thể ...

Và sau đó Thuộc tính sẽ xuất hiện! trong Java và .NET. Vì vậy, tôi nghĩ tốt hơn là bạn nên gọi nó là thành viên. Wheather họ là thành viên dụ (hoặc như bạn gọi nó là biến dụ) hoặc thành viên lớp ....

Chúc mừng!

1

Một thuộc tính có thể, và tôi cho là hầu hết, trả về một biến cá thể nhưng nó có thể làm được nhiều hơn. Bạn có thể đặt logic trong một thuộc tính, tổng hợp các giá trị hoặc cập nhật các biến cá thể khác vv. Tôi nghĩ tốt nhất là nên tránh làm như vậy. Logic nên đi vào các phương pháp.

0

Thuộc tính là một số loại dữ liệu được liên kết với một đối tượng. Ví dụ, một tài sản của một vòng tròn là đường kính của nó, và một tài sản khác là khu vực của nó.

Biến mẫu là một phần dữ liệu được lưu trữ trong một đối tượng. Nó không nhất thiết phải tương ứng trực tiếp với một tài sản. Ví dụ (heh), một vòng tròn có thể lưu trữ bán kính của nó trong một biến cá thể, và tính toán đường kính và diện tích của nó dựa trên bán kính đó. Cả ba vẫn là thuộc tính, nhưng chỉ bán kính được lưu trữ trong một biến mẫu.

Một số ngôn ngữ có khái niệm thuộc tính "hạng nhất". Điều này có nghĩa là đối với một ứng dụng khách, thuộc tính trông và được sử dụng như một biến cá thể. Tức là, thay vì viết một cái gì đó như circle.getDiameter(), bạn sẽ viết circle.diameter và thay vì circle.setRadius(5), bạn sẽ viết circle.radius = 5.

3

Hershi đúng về ngôn ngữ này. Nhưng để thêm vào đường dẫn của các câu trả lời cụ thể về ngôn ngữ:

Trong python, một biến mẫu là một thuộc tính của một cá thể, (thường) một cái gì đó được nhắc đến trong từ điển của cá thể.Điều này tương tự với các thành viên hoặc các biến mẫu trong Java, ngoại trừ tất cả mọi thứ là công khai.

Thuộc tính là lối tắt cho các phương thức getter/setter mà trông giống như một biến mẫu. Như vậy, trong định nghĩa lớp sau (sửa đổi từ Guido của new style object manifesto):

class C(object): 

    def __init__(self): 
     self.y = 0 

    def getx(self): 
     if self.y < 0: return 0 
     else: return self.y 

    def setx(self, x): 
     self.y = x 

    x = property(getx, setx) 

>>> z = C() 
>>> z.x = -3 
>>> print z.x 
0 
>>> print z.y 
-3 
>>> z.x = 5 
>>> print z.x 
5 
>>> print z.y 
5 

y là một biến thể hiện của z, x là một tài sản. (Nói chung, nơi một thuộc tính được định nghĩa, có một số kỹ thuật được sử dụng để che khuất biến liên quan đến ví dụ để mã khác không trực tiếp truy cập nó.) Lợi ích của các thuộc tính trong python là một nhà thiết kế không phải đi xung quanh bao bọc trước tất cả các biến mẫu, vì việc đóng gói trong tương lai bằng cách chuyển đổi một biến cá thể thành thuộc tính sẽ không phá vỡ bất kỳ mã hiện có nào (trừ khi mã đang lợi dụng sơ hở mà đóng gói của bạn đang cố sửa chữa hoặc dựa vào kiểm tra lớp học hoặc một số meta khác -kỹ thuật lập trình).

Tất cả điều này là câu trả lời rất dài để nói rằng ở cấp thiết kế, thật tốt khi nói về các thuộc tính. Nó là bất khả tri như những gì loại đóng gói bạn có thể cần phải thực hiện. Tôi đoán nguyên tắc này không phải là ngôn ngữ bất khả tri, nhưng áp dụng cho các ngôn ngữ bên cạnh python.

0

Ngược lại với các câu trả lời khác được đưa ra, tôi làm nghĩ rằng có sự khác biệt hữu ích giữa các biến thành viên và thuộc tính bất khả tri về ngôn ngữ.

Sự khác biệt rõ ràng nhất trong lập trình hướng thành phần, rất hữu ích ở mọi nơi, nhưng dễ hiểu nhất trong giao diện người dùng đồ họa. Trong bối cảnh đó, tôi có xu hướng nghĩ về cấu hình thời gian thiết kế của một thành phần như thao tác các "thuộc tính" của một đối tượng. Ví dụ, tôi chọn màu nền trước và màu nền, kiểu đường viền và phông chữ của trường nhập văn bản bằng cách đặt thuộc tính của nó. Trong khi các thuộc tính này có thể được thay đổi khi chạy, thường thì không. Trong thời gian chạy, một tập hợp các biến khác nhau, đại diện cho nội dung của trường, có nhiều khả năng được đọc và viết hơn. Tôi nghĩ thông tin này là "trạng thái" của thành phần.

Tại sao sự khác biệt này hữu ích? Khi tạo ra một trừu tượng cho các thành phần hệ thống dây điện với nhau, thường chỉ các biến "trạng thái" cần phải được tiếp xúc. Quay lại ví dụ trường văn bản, bạn có thể khai báo một giao diện cung cấp quyền truy cập vào nội dung hiện tại. Nhưng "thuộc tính" điều khiển giao diện của thành phần chỉ được định nghĩa trên một lớp thực hiện cụ thể.

2

Trong mục tiêu c, một thuộc tính là một biến cá thể có thể tận dụng lợi thế của toán tử dấu chấm quá tải để gọi hàm setter và getter của nó. Vì vậy, my.food = "cheeseburger" thực sự được hiểu là [setFood: "cheeseburger của tôi"]. Đây là một trường hợp khác mà định nghĩa chắc chắn không phải là ngôn ngữ bất khả tri vì mục tiêu-c định nghĩa từ khóa @property.

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