thắc mắc Lúc nào thì nên sử dụng private attribute trong Python class?

Doc_Co_Cau_Bai

Junior Member
Hi các bác,

E đang bắt đầu học về OOP trong python thì thấy người ta đưa ra khái niệm private attribute, rồi getter setter @Property tá lả.

E chỉ hiểu đại khái là khi mình tạo 1 object từ class, cứ thế mà dùng bt, như dưới đây.

Python:
class Person:
  def __init__(self, name, age):
    self.name = name
    self.age = age

p1 = Person("John", 36)

print(p1.name)
print(p1.age)

Thấy một số ví dụ bọn nó dùng kiểu self._name, rồi self.__name mà ko hiểu lí do, use case nào thì nên dùng private attribute? Bác nào có kn thông não giúp vứi :confuse:
 
private attribute khi chỉ muốn cho cái attribute được truy cập trong class đó thôi fen. Còn bình thường toàn public thôi mà, suy nghĩ nhiều mấy cái đó làm gì.
 
tên nó rõ ràng rồi còn gì myphen. Private attribute thì nội bộ class dùng (ví dụ lưu state hiện tại của object, bla bla...). Nhưng tên là private mà bên ngoài vẫn truy cập được private attributes
 
Cho chú keyword tìm hiểu về Encapsulation trong OOP trước khi hỏi câu này nhé. Hiểu đc cái khái niệm đấy thì mới vận dụng đc OOP java c# python cũng vậy thôi
 
Bạn là sinh viên? Hay là người muốn chuyển nghề?
Nếu loại 1 thì trường nào thần kinh dạy OOP bằng python thế :confuse:
Nếu loại 2 thì bạn nên học OOP + cơ bản 1 ngôn ngữ nào trước rồi hãy sang python, đừng nghe mấy thằng trên này nói linh tinh python javascript dễ học :beat_shot:
Private attribute cực kì quan trọng, 60% các thuộc tính của dự án lớn là private attribute chứ không phải public nha :D
 
Bạn là sinh viên? Hay là người muốn chuyển nghề?
Nếu loại 1 thì trường nào thần kinh dạy OOP bằng python thế :confuse:
Nếu loại 2 thì bạn nên học OOP + cơ bản 1 ngôn ngữ nào trước rồi hãy sang python, đừng nghe mấy thằng trên này nói linh tinh python javascript dễ học :beat_shot:
Private attribute cực kì quan trọng, 60% các thuộc tính của dự án lớn là private attribute chứ không phải public nha :D

E làm network, trc ở đh cũng có học qua c, java mà nói thật ngày đấy cắm võ lâm là chính chứ học hành mẹ gì đâu, quên tiệt.:sure:
 
Hi các bác,

E đang bắt đầu học về OOP trong python thì thấy người ta đưa ra khái niệm private attribute, rồi getter setter @Property tá lả.

E chỉ hiểu đại khái là khi mình tạo 1 object từ class, cứ thế mà dùng bt, như dưới đây.

Python:
class Person:
  def __init__(self, name, age):
    self.name = name
    self.age = age

p1 = Person("John", 36)

print(p1.name)
print(p1.age)

Thấy một số ví dụ bọn nó dùng kiểu self._name, rồi self.__name mà ko hiểu lí do, use case nào thì nên dùng private attribute? Bác nào có kn thông não giúp vứi :confuse:


Python ko ràng buộc kỹ private att rõ như C# hay Java, cái _name chỉ là quy ước ngầm với nhau thôi

còn cáí __name thì bạn ko nên dùng nó (chỉ tổ rắc rối thêm) , chỉ nên quan tâm cái nào có __name__ ( giống như __init__ ý )
Vi dụ :
Python:
class Person:
  def __init__(self, name, age):
    self.name = name
    self.age = age
  def __rep__(self):
     return '{} - {} '.format(self.name, self.age)

p1 = Person("John", 36)

print(p1.name)
print(p1.age)
print(p1)
 
Tiện đây bác nào có bản Pycharm full crack hay key kích hoạt cho em xin với ạ :big_smile:
IDE của Jetbrain mà không có SSD thì mỗi lần bật đứng dậy đi pha trà :giggle:
https://www.fshare.vn/file/MYPCA5K5S9LW?token=1594802079
Nhưng mà đã dùng rồi thì Visual Studio cũng phải ném đi , nó gợi ý đến tận chân răng, kiểu không rành syntax nó cũng nhắc ra để chạy được :sleep:
 
Last edited:
Bạn là sinh viên? Hay là người muốn chuyển nghề?
Nếu loại 1 thì trường nào thần kinh dạy OOP bằng python thế :confuse:
Nếu loại 2 thì bạn nên học OOP + cơ bản 1 ngôn ngữ nào trước rồi hãy sang python, đừng nghe mấy thằng trên này nói linh tinh python javascript dễ học :beat_shot:
Private attribute cực kì quan trọng, 60% các thuộc tính của dự án lớn là private attribute chứ không phải public nha :D
Trong trường hợp thuộc tính là private nhưng lại có getter/setter là public thì có gì hơn là chơi thuộc tính public luôn không thím? Chỉ xét trường hợp setter gán trực tiếp giá trị mà ko cần kiểm tra điều kiện gì nhé
 
Trong trường hợp thuộc tính là private nhưng lại có getter/setter là public thì có gì hơn là chơi thuộc tính public luôn không thím? Chỉ xét trường hợp setter gán trực tiếp giá trị mà ko cần kiểm tra điều kiện gì nhé
Thường thì trong OOP chỉ những attr nào là constant mới để public, còn lại đều để private hết nên cần getter/setter. Còn vì sao nên để private thì bạn đọc đặc tính đóng gói trong OOP nhé :)
 
Thường thì trong OOP chỉ những attr nào là constant mới để public, còn lại đều để private hết nên cần getter/setter. Còn vì sao nên để private thì bạn đọc đặc tính đóng gói trong OOP nhé :)
Ví dụ như thế này:
C#:
private int age;

public int getAge()
{
  return this.age;
}

public void setAge(int age)
{
  this.age = age;
}
Thì so với cách này có gì hơn không?
C#:
public int age {get; set;}
 
Ví dụ như thế này:
C#:
private int age;

public int getAge()
{
  return this.age;
}

public void setAge(int age)
{
  this.age = age;
}
Thì so với cách này có gì hơn không?
C#:
public int age {get; set;}
Hơn ở chỗ là nếu sau này bạn có bất kỳ thay đổi gì với attr age này thì những đoạn code của những dev khác có sử dụng đến attr này sẽ không bị ảnh hưởng vì họ không access trực tiếp đến attr này mà access gián tiếp qua 1 lớp interface bạn đã quy định (getter/setter, ...) . Ví dụ nếu bạn đổi tên attr hay đổi logic đằng sau attr đó (age từ tuổi thực thành tuổi mụ chẳng hạn) thì các đoạn code của những người khác sẽ không bị ảnh hưởng nếu interface của bạn consistent
 
Hơn ở chỗ là nếu sau này bạn có bất kỳ thay đổi gì với attr age này thì những đoạn code của những dev khác có sử dụng đến attr này sẽ không bị ảnh hưởng vì họ không access trực tiếp đến attr này mà access gián tiếp qua 1 lớp interface bạn đã quy định (getter/setter, ...) . Ví dụ nếu bạn đổi tên attr hay đổi logic đằng sau attr đó (age từ tuổi thực thành tuổi mụ chẳng hạn) thì các đoạn code của những người khác sẽ không bị ảnh hưởng nếu interface của bạn consistent
Vậy cái này đúng khi class đó là interface thôi à ?
 
Đây là quy tắc thiết kế object theo hướng OOP mà bạn, nó có thể áp dụng khi thiết kế bất kỳ object nào trong chương trình
Biết là nguyên tắc OOP thì các att nên để private và dùng hàm set get để access.
Nhưng thực tế là có phải Object nào cũng cần như vậy ko hay chỉ các astract class, interface class thôi. tại thực tế mình thấy code toàn public ầm ầm.
 
Back
Top