2016-02-10 16 views
6

Khi tôi đặt thuộc tính, getattr kết quả là id thay đổi giá trị id. Khi tôi đặt phương thức, getattr kết quả id không thay đổi. Tại sao?Tại sao setattr hoạt động khác với các thuộc tính và phương thức?

class A (object): 
    a = 1 
a = 42 
print id(getattr(A, 'a')) 
print id(a) 
setattr(A, 'a', a) 
print id(getattr(A, 'a')) 
# Got: 
# 36159832 
# 36160840 
# 36160840 

class B (object): 
    def b(self): 
     return 1 
b = lambda self: 42 
print id(getattr(B, 'b')) 
print id(b) 
setattr(B, 'b', b) 
print id(getattr(B, 'b')) 
# Got: 
# 140512684858496 
# 140512684127608 
# 140512684858496 
+3

Không có trong python 3 – Lol4t0

Trả lời

3

Sự khác biệt được dựa trên cách phương pháp làm việc trong python

lưu ý rằng

>>> B.b 
<unbound method B.<lambda>> 

phương pháp đang thực sự xây dựng sử dụng descriptors

Cập nhật "phương pháp", các mô tả isn' t thay đổi

Nhìn vào bên trong trình mô tả, chúng tôi f ind chức năng cơ bản không

class B (object): 
    def b(self): 
     return 1 
b = lambda self: 42 
print id(getattr(B, 'b')) 
print id(b) 
setattr(B, 'b', b) 
print id(getattr(B, 'b')) 
print id(getattr(B, 'b').im_func) # grab function from the descriptor 


4424060752 
4440057568 
4424060752 
4440057568 # here's our new lambda 

Bạn cũng có thể có một cái nhìn tại

B.__dict__['b'] 

trước và sau khi

+0

Cảm ơn rất nhiều! Đó là những gì tôi đang tìm kiếm. – Timur

+0

Bạn được chào đón. Nó có thể hữu ích cho người khác nếu bạn đánh dấu câu trả lời là "được chấp nhận" – second

Các vấn đề liên quan