2012-06-06 47 views
8

thể trùng lặp:
What is the difference between @staticmethod and @classmethod in Python?Python Phương pháp tĩnh, tại sao?

Tôi có một số câu hỏi về staticmethods trong các lớp học. Tôi sẽ bắt đầu bằng cách đưa ra một ví dụ.

Ví dụ một:

class Static: 
    def __init__(self, first, last): 
     self.first = first 
     self.last = last 
     self.age = randint(0, 50) 
    def printName(self): 
     return self.first + self.last 
    @staticmethod 
    def printInfo(): 
     return "Hello %s, your age is %s" % (self.first + self.last, self.age) 

x = Static("Ephexeve", "M").printInfo() 

Đầu ra:

Traceback (most recent call last): 
    File "/home/ephexeve/Workspace/Tests/classestest.py", line 90, in <module> 
    x = Static("Ephexeve", "M").printInfo() 
    File "/home/ephexeve/Workspace/Tests/classestest.py", line 88, in printInfo 
    return "Hello %s, your age is %s" % (self.first + self.last, self.age) 
NameError: global name 'self' is not defined 

Ví dụ hai:

class Static: 
    def __init__(self, first, last): 
     self.first = first 
     self.last = last 
     self.age = randint(0, 50) 
    def printName(self): 
     return self.first + self.last 
    @staticmethod 
    def printInfo(first, last, age = randint(0, 50)): 
     print "Hello %s, your age is %s" % (first + last, age) 
     return 

x = Static("Ephexeve", "M") 
x.printInfo("Ephexeve", " M") # Looks the same, but the function is different. 

Đầu ra

Hello Ephexeve M, your age is 18 

Tôi thấy tôi không thể gọi bất kỳ self.attribute trong một staticmethods, tôi chỉ không thực sự chắc chắn khi nào và tại sao để sử dụng nó. Trong tâm trí của tôi, nếu bạn tạo ra một lớp học với một vài quy, có lẽ bạn muốn sử dụng chúng sau này, và không có một staticmethod nơi tất cả các thuộc tính không thể gọi được. Bất cứ ai cũng có thể giải thích cho tôi điều này? Python là ngôn ngữ lập trình đầu tiên của tôi, vì vậy nếu điều này giống nhau trong Java chẳng hạn, tôi không biết.

+0

Ghét để bỏ phiếu để đóng, nhưng câu trả lời trong câu hỏi tôi đã liên kết là khá tốt. Lưu ý rằng '@ classmethod' tương tự như javas' static'. '@ staticmethod' khá là vô ích. –

+0

Cảm ơn Josh, có lẽ tôi đã không tìm kiếm đúng cách, nhờ liên kết, sẽ kiểm tra ngay bây giờ –

Trả lời

8

Bạn đang cố gắng đạt được điều gì với số staticmethod? Làm thế nào bạn mong đợi nó để giải quyết bất cứ vấn đề của bạn là gì nếu bạn không biết nó làm gì?

Hoặc bạn có đang chơi xung quanh để xem những gì staticmethod không? Trong trường hợp đó, nó có thể sẽ hiệu quả hơn để read the docs được cho biết những gì nó làm, thay vì ngẫu nhiên áp dụng nó và cố gắng đoán từ hành vi của nó.

Trong mọi trường hợp, áp dụng @staticmethod cho định nghĩa chức năng trong một lớp sẽ tạo ra một "phương pháp tĩnh". "Tĩnh" không may là một trong những thuật ngữ bị quá tải gây nhầm lẫn nhất trong lập trình; ở đây nó có nghĩa là phương pháp không phụ thuộc vào hoặc thay đổi trạng thái của đối tượng. Nếu tôi có phương thức tĩnh foo được định nghĩa trong một lớp Bar, sau đó gọi bar.foo(...) (trong đó bar là một số thể hiện của lớp Bar) sẽ thực hiện chính xác điều tương tự bất kể thuộc tính của thuộc tính bar. Thật vậy tôi có thể gọi nó trực tiếp từ lớp như Bar.foo(...) khi tôi thậm chí không có một ví dụ!

Điều này đạt được bằng cách đơn giản là không truyền mẫu vào phương thức tĩnh, do đó phương thức tĩnh không có tham số self.

Phương pháp tĩnh hiếm khi cần thiết, nhưng đôi khi thuận tiện. Chúng thực sự giống như các hàm đơn giản được định nghĩa bên ngoài lớp, nhưng đặt chúng trong lớp đánh dấu chúng là "liên kết" với lớp. Bạn thường sẽ sử dụng chúng để tính toán hoặc làm những việc có liên quan chặt chẽ đến lớp, nhưng không thực sự hoạt động trên một số đối tượng cụ thể.

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