Vấn đề class trong python

mình có một class trong python như này

class Teacher:
    id=''
    name=''
    bacluong=0
    def DisPlayTeacher(self):
        print'id cua giao vien la:',self.id
        print'ten cua giao vien la :',self.name
        print'bac luong cua giao vien la :',self.bacluong
giaovien=Teacher()
giaovien.id='tc001'
giaovien.name='nguyen phuong dong'
giaovien.bacluong=5
giaovien.GiaoVien()

lúc chạy đoạn code này nó sẽ in ra giá trị bình thường bao gồm id và tên và bac lương bình thường
nhưng nếu em thay thế đoạn code DisPlayTeacher là như này thì nó lại không in ra được

 def DisPlayTeacher(self):
       print'id cua giao vien la:',Teacher.id
        print'ten cua giao vien la :',Teacher.name
        print'bac luong cua giao vien la :',Teacher.bacluong

thì khi chạy cái hàm này nó lai ko in ra được giá trị .Vậy nguyên nhân là do làm sao vậy

Điều này rất dễ hiểu

id=''
name=''
bacluong=0

Đây là 3 attribute mặc định mà tất cả các instance của class Teacher đều sẽ có và đương nhiên cả class Teacher cũng có.

giaovien.id='tc001'
giaovien.name='nguyen phuong dong'
giaovien.bacluong=5

Có nghĩa là thay đổi giá trị attribute của instance giaovien không phải thay đổi giá trị attribute của class Teacher. Do đó

 def DisPlayTeacher(self):
       print'id cua giao vien la:',Teacher.id
       print'ten cua giao vien la :',Teacher.name
       print'bac luong cua giao vien la :',Teacher.bacluong

Vẫn sẽ có các giá trị ban đầu
Còn nếu

def DisPlayTeacher(self):
     print'id cua giao vien la:',self.id
     print'ten cua giao vien la :',self.name
     print'bac luong cua giao vien la :',self.bacluong

self chính là đại diện cho instance.

giaovien.GiaoVien()

Khi bạn invoker method như trên nó sẽ vào trong thay các parameters bằng các giá trị của arguments pass với self sẽ nhận giá trị giaovien

def DisPlayTeacher(self):
    print'id cua giao vien la:',giaovien.id
    print'ten cua giao vien la :',giaovien.name
    print'bac luong cua giao vien la :',giaovien.bacluong

Và đương nhiên là kết quả bạn mong muốn

2 Likes

xin cho hỏi thêm một vấn đề nữa là

cái đoạn này nó có nghĩa là gì 
re.match( r'(.*) la (.*?) .*', line, re.M|re.I)
 r'(.*) la (.*?) .*'
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?