2011-01-15 33 views
5

thể trùng lặp:
Can I add custom methods/attributes to built-in Python types?Thêm phương pháp tùy chỉnh để đối tượng chuỗi

Trong Ruby bạn có thể ghi đè lên bất kỳ built-in Class đối tượng với phương pháp tùy chỉnh, như thế này:

class String 
    def sayHello 
    return self+" is saying hello!" 
    end 
end        

puts 'JOHN'.downcase.sayHello # >>> 'john is saying hello!' 

Làm thế nào tôi có thể làm điều đó trong python? Có cách nào bình thường hay chỉ là hack?

+1

Điều này vừa được trả lời trong http://stackoverflow.com/questions/4698493/can-i-add-custom-methods-attributes-to-built-in-python-types/4698550#4698550. Đề xuất đóng. – TryPyPy

+0

Monkeypatching là có thể nhưng có giới hạn, như đã chỉ ra trong câu hỏi đó (và thậm chí nhiều hơn). Tôi khuyên bạn chỉ cần xác định một chức năng "miễn phí" thực hiện điều này. – delnan

Trả lời

11

Bạn có thể không phải vì được xây dựng trong-loại được mã hoá trong C. Những gì bạn có thể làm là phân lớp các loại:

class string(str): 
    def sayHello(self): 
     print(self, "is saying 'hello'") 

Test:

>>> x = string("test") 
>>> x 
'test' 
>>> x.sayHello() 
test is saying 'hello' 

Bạn cũng có thể ghi đè lên str- nhập với class str(str):, nhưng điều đó không có nghĩa là bạn có thể sử dụng chữ số "test" bằng chữ, vì nó đang liên kết đến số được dựng sẵn str.

>>> x = "hello" 
>>> x.sayHello() 
Traceback (most recent call last): 
    File "<pyshell#10>", line 1, in <module> 
    x.sayHello() 
AttributeError: 'str' object has no attribute 'sayHello' 
>>> x = str("hello") 
>>> x.sayHello() 
hello is saying 'hello' 
3

Các Python bình thường tương đương với này là viết một hàm mang theo một chuỗi như đó là số đầu tiên:

def sayhello(name): 
    return "{} is saying hello".format(name) 

>>> sayhello('JOHN'.lower()) 
'john is saying hello' 

đơn giản sạch sẽ và dễ dàng. Không phải mọi thứ đều phải là một cuộc gọi phương thức.

+0

Những bất lợi của phương pháp này là bạn không thể viết một phương pháp mutator. Ví dụ, hôm nay tôi muốn một phương thức 'str.startswithThenRemove (p)' thay đổi 'str' để loại bỏ tiền tố tùy chọn' p' và sau đó trả về 'True' nếu tiền tố được tìm thấy và' Sai' nếu nó không phải là: 'if option.startswithThenRemove (" - foo = "): handleFoo (tùy chọn)'. Bạn không thể làm điều đó trong bất kỳ cách nào dễ dàng trong Python (nhưng xem http://stackoverflow.com/a/1551223/1424877). – Quuxplusone

+4

Thậm chí nếu bạn có thể thêm một phương thức tùy chỉnh vào một chuỗi, bạn vẫn không thể viết một phương thức mutator: Các chuỗi Python không thay đổi được. – Duncan

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