2011-01-21 30 views
14

Tôi đang cố gắng để hiểu một chút như thế nào Python (2.6) thỏa thuận với lớp, trường và như vậy, và tại một điểm nào đó, tôi đã cố gắng mã này:biến lớp Overriding trong python

#/usr/bin/python2.6 

class Base(object): 
    default = "default value in base" 

    def __init__(self): 
     super(Base, self).__init__() 

    @classmethod 
    def showDefaultValue(cls, defl = default): 
     print "defl == %s" % (defl) 


class Descend(Base): 
    default = "default value in descend" 

    def __init__(self): 
     super(Descend, self).__init__() 

if __name__ == "__main__": 
    Descend.showDefaultValue() 

Sản lượng là: "giá trị mặc định trong cơ sở"

Tôi đã tự hỏi tại sao trường "mặc định" không được overwirtten bởi lớp Descend ... Có cách nào để ghi đè lên nó không? Tại sao nó không bị ghi đè?

Bất kỳ gợi ý nào (hoặc liên kết đến trang giải thích sẽ được đánh giá cao). Cảm ơn bạn!

Trả lời

12

Biến lớp đang được ghi đè. Hãy thử

@classmethod 
def showDefaultValue(cls): 
    print "defl == %s" % (cls.default,) 

Lý do theo cách của bạn không làm việc với cách Python xử lý đối số mặc định cho chức năng so với thuộc tính lớp học. Giá trị mặc định cho defl được đánh giá tại thời điểm Python xác định ràng buộc cho showDefaultValue và điều này được thực hiện chính xác một lần. Khi bạn gọi phương thức của mình, giá trị mặc định được sử dụng là giá trị được đánh giá tại thời điểm định nghĩa.

Trong trường hợp của bạn, defl bị ràng buộc với giá trị của biến số default giống như trong quá trình thực hiện biểu mẫu dạng lớp Base. Bất kể cách bạn gọi showDefaultValue sau này (tức là, dù qua số Base hoặc qua Descend) giá trị đó vẫn cố định trong tất cả các lần gọi sau showDefaultValue.

12
def showDefaultValue(cls, defl=default): 

có nghĩa là default được đánh giá khi hàm được xác định, như thường lệ trong Python. Vì vậy, định nghĩa trông như thế này thì:

def showDefaultValue(cls, defl="default value in base"): 

Giá trị này của defl được lưu giữ như một đối số mặc định trên đối tượng chức năng và sử dụng khi bạn gọi phương thức không có đối số. Bạn có thể xem các giá trị mặc định của một hàm như print Descend.showDefaultValue.im_self.default để xác thực điều này.

Nếu bạn muốn nhận được mặc định từ lớp hiện tại thì bạn phải có được nó từ đó:

@classmethod 
def showDefaultValue(cls, defl=None): 
    if defl is None: 
     defl = cls.default 
    print "defl == %s" % (defl)