30/09/2018, 19:33

Vấn đề về hướng đối tượng trong Python

Thực sự thì em cảm thấy quá bế tắc với vấn đề này nên e mới đặt câu hỏi.E không thể hiểu đc cách hoạt động của def tong class
-Class là gì?? Tại sao phải dùng Class ???
-init là gì ?? nó có phải là khai báo biến để dùng chung cho mọi def khác không??
-init tự động chạy khi khai báo đối tượng??
-sefl có thể giải thích như nào cho dễ hiểu nhất??
-Tại sao trong class lại phải có nhiều def??chứa cái khác được không ??
Các Bác có thể lấy ví dụ thực tế trong cs để giải thích giúp em về vấn đề này giúp em.Em tìm nhiều tài liệu nói về class nhưng vẫn k hiểu.
Cảm ơn các bác !!!

anon10499953 viết 21:41 ngày 30/09/2018

Bạn phải hiểu lập trình hướng đối tượng là gì trước rồi mới quan tâm đến init, def, self.

Còn nếu bạn đã biết về OOP nhưng gặp khó khăn về cú pháp của Python thì:
def là từ khóa khai báo hàm hay method
self cũng giống như this trong C++ hay Java
__init__ là phương thức khởi tạo đối tượng.

vimanh viết 21:44 ngày 30/09/2018

cảm ơn bác.những khái niệm đó em đều biết hết bác ạ.nhưng thực sự thì em không thể hiểu đc cách nó làm việc
bác có thể lấy giúp em 1 vd thực tế để em thông não không.bí bách khó chịu quá.

Hoa Vo Van viết 21:46 ngày 30/09/2018

Mình ví dụ đơn giản class python cho bạn dễ hiểu:

class Daynhauhoc(object):
    name = ""
    def __init__(self,name):
        self.name = name
    def showName(self):
        print "Name of Website: "+self.name
# new object of class Daynhauhoc
demo = Daynhauhoc("Day nhau hoc")
#call function of object demo
demo.showName()

Output:

Name of Website: Day nhau hoc

Ở trên là 1 ví dụ cơ bản của 1 class trong python:


class Daynhauhoc(object):

Ở trên là khai báo class Daynhauhoc kế thừa từ class object

def __init__(self,name):
        self.name = name

Hàm _init_ là hàm constructor mặc định của class. khi new 1 object của class thì sẽ tự động nhảy vào thực hiện hàm này.
Từ khóa def để định nghĩa 1 hàm trong python, không như trong C# hoặc Java con trỏ this tự thêm vào function trong class, hàm trong class của python phải có tham số self.
Khi gọi hàm thì có thể truyền vào self hoặc không cần., 2 cách gọi hàm theo bên dưới là như nhau.

demo.showName()  == demo.showName(self)

Hi vọng giúp bạn hiểu hơn về class trong python. Có gì thắc mắc mình sẽ trả lời thêm cho bạn

Pham Van Hai viết 21:33 ngày 30/09/2018

Đọc câu hỏi của bạn thì có vẻ như bạn không hiểu gì về lập trình hướng đối tượng (OOP).
Bạn nên tìm hiểu về OOP trước.

vimanh viết 21:37 ngày 30/09/2018

Có lẽ.mình chỉ nghĩ đơn giản HĐT là tạo ra đối tượng(thực thể ) để giải quyết vấn đề.Không biết có đúng k nữa

Chí Cường Trần viết 21:42 ngày 30/09/2018

Bạn nên hiểu hướng đối tượng trước có rất nhiều tài liệu trên mạng. Lúc đầu mình cũng rất mơ hồ. Bạn đang đi theo hướng đúng đó. Bạn nên tìm hiểu ứng dụng của nó để có thể dễ hiểu hơn. Nếu không bạn đọc mà cũng không thể hiểu nó dùng để làm gì thì rất khó nhớ
Tóm lươt như thế này

  • Hướng đối tượng được xây dựng ra mục đích dùng để giải quyết những phần mềm có độ phức tạp.Dùng HDT có thể tái sử dụng được nhiều thứ. viết hướng đối tượng dễ bảo trì. có cấu trúc rõ ràng logic.

HĐT có những thuộc tính sau

  • tính kế thừa: mình muốn tạo 1 thực thể khác mà nó có rồi thì chỉ cần kế thừa lại là xong
  • tính đóng gói: cái này thì để phân biệt những thực thể với nhau thông qua namespace
  • tính trừu tượng: là mình có thể lên khung sườn 1 class chung mà class này chỉ có những hàm mà những hàm này chỉ có tên hàm và giá trị trả về mà không có nội dung.
  • tính đa hình: cùng 1 phương thức sẽ có cách thực hiện khác nhau khi gặp 1 class khác nhau
  • Người ta hiện thực hóa những thực thể ngoài đời thực vào trong những class, những class này sẽ chứa nhưng property đại diện cho thuộc tính của thực thể đó. rồi trong class còn có phương thức, những phương thức này dùng để thực hiện hành động cho thực thể.

ví dụ
có class(thực thể) như sau

class concoho{
ten as tring
mau as string
method can(){
print('ten tao là : ’ & ten & ‘ai lai gan tao can’)
}
}

cái này chỉ là tóm lượt đơn giản cho bạn dễ hiểu
nếu muốn chi tiết phải đọc kỹ hơn rồi thực hành nhiều

có gì sai mấy bạn chém nhẹ tay!

Nguyễn Đức Hoàng viết 21:48 ngày 30/09/2018

class Daynhauhoc(object):
name = “”
def init(self,name):
self.name = name
def showName(self):
print "Name of Website: "+self.name

new object of class Daynhauhoc

demo = Daynhauhoc(“Day nhau hoc”)
#call function of object demo
demo.showName()

Cho mình hỏi chút, Tham số “Day nhau hoc” truyền vào object Demo. Tham số này sau đó sẽ truyền trực tiếp vào hàm init với đối số name (def init(self,name)). Vậy tham số này chỉ có thể truyền vào hàm init (Nó chỉ làm việc với hàm này) thôi đúng ko bạn. Nếu ko có hàm init. Thì phải khai báo dạng: demo=Daynhauhoc()?

Hoa Vo Van viết 21:38 ngày 30/09/2018

Bạn không cần viết hàm init nhưng khi bạn khởi tạo 1 object thì nó tuỳ thuộc vào tham số khởi tạo để gọi hàm init. Lúc đó bắt buộc bạn phải implement hàm init tương ứng, nếu không run sẽ báo lỗi
Ví dụ:
demo = Daynhauhoc() thì gọi hàm init() =>defualt có sẵn nên không có thì không báo lỗi
demo = Daynhauhoc(1_tham_so) thì gọi hàm init(1_tham_so) => nếu không có nó sẽ báo lỗi.

Nguyễn Đức Hoàng viết 21:44 ngày 30/09/2018

Bạn không cần viết hàm init nhưng khi bạn khởi tạo 1 object thì nó tuỳ thuộc vào tham số khởi tạo để gọi hàm init. Lúc đó bắt buộc bạn phải implement hàm init tương ứng, nếu không run sẽ báo lỗiVí dụ: demo = Daynhauhoc() thì gọi hàm init() =>defualt có sẵn nên không có thì không báo lỗi demo = Daynhauhoc(1_tham_so) thì gọi hàm init(1_tham_so) => nếu không có nó sẽ báo lỗi.

Thank bạn, mình đã hiểu đc chút ít. Mình hiểu đơn giản tham số truyền vào class khi tạo một object mới thì nó chỉ dành cho hàm init . Ngoài khởi tạo biến ra thì trong hàm init này có thể có các chức năng khác không bạn. Và biến này là biến dùng trong class đung ko ah (biến cục bộ trong phạm vi class)

Hoa Vo Van viết 21:34 ngày 30/09/2018

Cái tên init để chỉ mục đích của nó là làm tất cả công việc để khởi tạo object cho đúng, kiểm soát lỗi trước khi sử dụng nên nó ko còn chức năng nào khác

Bài liên quan
0