01/10/2018, 09:45
Python self trong Class
Chào cả nhà , em vừa mới học python chừng 2 tuần,về đụng đến phần Class trong python, em đã đọc qua OOP là gì và cũng khá hiểu vài cái ví dụ như Constructor hoặc Method của class ,nhưng thật sự em vẫn không biết từ khóa “self” để làm gì , tại sao phải buộc có nó , và sử dụng như thế nào cho đúng ,dưới đây là đoạn code em mượn của bạn để hỏi cho tiện ạ:
class Trigger(object):
"""Base class for all triggers"""
def __init__(self, x, y, z, block_type, block_data=0, one_time=True):
# set values
self.pos = Vec3(x, y, z)
self.block = Block(block_type, block_data)
self.one_time = one_time
# add self to triggers list
triggers.append(self)
class TriggerStepOn(Trigger):
"""Base class for blocks that trigger an event when it is step on"""
def __init__(self, x, y, z, block_type, block_data=0, one_time=True):
Trigger.__init__(self, x, y + 1, z, block_type, block_data, one_time)
# set block under trigger block to correct type
mc.setBlock(x, y, z, self.block)
def condition(self):
"""check if hansel steps on block"""
if self.pos == tilePos:
return True
return False
Bài liên quan
mình có một số bài viết về python oop. Tuy chưa hết nhưng đã có nói qua về self. Bạn tham khảo https://medium.com/graktung/series-python-oop-tập-1-class-and-instances-1fd17f499055
Dạ mình cảm ơn , mình sẽ đọc ngay
Mọi người nhớ để lại cho em một vài ví dụ dễ hiểu về cách sư dụng self ,em cảm ơn rất nhiều
Cảm ơn bạn mình hiểu self rồi ,nhưng lại thắc mắc về cách tạo Class con thừa kế , và việc gọi constructor của Class con hoặcviệc gọi constructor của Class cha trong class hoặc việc gọi cả constructor của cha và con trong Class con ảnh hưởng như nào.Mình tìm trong bài viết không thấy
Dạo này mình bận quá nên chưa viết thêm được.
Bác xóa bài bao giờ thế T.T
Cũng lâu rồi
còn link không bác, cho em với. Đang hoang mang quá
Bạn đang tìm hiểu Python OOP?
vâng. càng học càng rối như tơ vò
Bữa trước mình mới thấy bạn tìm hiểu C, C++ mà sao giờ đã tới Python OOP rồi vậy? Bạn nói rõ xem rối chỗ nào? mình rảnh sẽ viết cho bạn hiểu
em đang học Python.
C em học từ thời gian trước rồi, không sâu lắm. Hôm trước thằng bạn nó hỏi bài em, em thì cũng lơ mơ phần đấy nên hỏi thôi ^^
Em có một số câu hỏi:
-Anh có thể giả thích kĩ hơn cách mà hàm__init__ hoạt động giúp em được không ạ Em được biết nó là hàm này sẽ được chạy đầu tiên khi tạo một đối tượng. Các biến trong nó có phải là biến cục bộ của cả class ?2
1.Các hàm bên trong một class, luôn có tham số self, self là bắt buộc của cú pháp hay chỉ là tên mà người ta quy ước với nhau
self
là đại diện choinstance
. Hãy xem ví dụ sau đâyMình sẽ cho bạn thấy sự khác biệt giữa có
self
và không cóself
Bạn thấy chứ,
wazzup() takes 0 positional arguments but 1 was given
. Rõ ràng ta không truyền bất cứargument
nào nhưng nó lại báo là đã truyền 1. Sự thật là mình đã truyền mộtargument
là đối tượngob
. Và đương nhiên chúng ta cần mộtparameter
trong phương thức để nhận lấy giá trị đó. Và người ta quy ước dùngself
. Vì sao là quy ước? Bởi vì nó chỉ làparameter
thôi, bạn hoàn toàn có thể thay thế những chữ cái khác nếu bạn thích. Theo mình biết là như thế, tại mình từng vọc và thay thếself
bằng chữ trời ơi đất hỡi khác và vẫn được.2.Class abc(object): kế thừa lớp object, vậy cái class object nó ở chỗ nào và nó có những phương thức nào ạ
Thật ra thì
text editor
nó in ra thế thôi chứ làm gì cóobject
nào . Nó giống như việc nó gõ dùm bạn syntax sẵn thôi.3.Anh có thể giả thích kĩ hơn cách mà hàm__init__ hoạt động giúp em được không ạ.
Cái phương thức này đặc biệt ở chỗ nó sẽ tự động được
invoke
(gọi) khi khởi tạo đối tượng. Cũng còn một cái method nữa cũng sẽ đượcinvoke
nhưng cũng chả nhớ lắm vì nó không quan trọng. Nó giống như là một cái setup dùm attribute cho đói tượng dùm mình. Lấy ví dụ đơn giản không dùng__init__
Đặt vấn đề, bạn phải khai báo 100 đối tượng (không dùng loop - vòng lặp) thì bạn phải mất 1 dòng khởi tạo đối tương, 3 dòng khởi tạo các attribute tổng cộng là 4 dòng 1 đối tượng => 400 dòng 100 đối tượng. Ta hãy than khảo phương thức
__init__
nhéTa sẻ khởi tạo đối tượng, nhớ là thêm cho đủ 4
argument
Và hãy thay thế những thứ mới đề cập đi nào
Sẽ được biến hóa thành
Vậy ta chỉ cần 100 dòng cho 100 đối tượng. + 4 dòng cho phương thức
__init__
là 104Không những thế, bạn còn tránh sai sót khi khởi tạo thiếu attribute mà bạn không hề biết.
Em cảm ơn anh nhiều. Vẫn còn hơi mông lung nhưng em cũng hiểu được 80-90% những gì anh nói r ạ :))
Ai gặp hướng đối tượng thì cũng hơi khó hiểu ban đầu. Nếu em biết ai mà hiểu ngay từ lần đầu tiên thì nói cho anh biết nhé
Chắc chỉ có ông nghĩ ra cái gọi là OOP thì mới hiểu luôn anh ạ :))