Các phương thức lớp của Wikipedia là gì
Một "phương thức cá thể" sử dụng thông tin có trong thể hiện để tìm ra giá trị nào sẽ trả về (hoặc tác dụng phụ nào sẽ làm). Đây là rất phổ biến.
Một "phương thức lớp" sử dụng thông tin về lớp (và không phải là một thể hiện của lớp đó) để ảnh hưởng đến những gì nó làm (chúng thường được sử dụng để tạo các thể hiện mới như các hàm tạo thay thế, và do đó không phổ biến lắm).
Một "phương thức tĩnh" không sử dụng bất kỳ thông tin nào về lớp hoặc thể hiện để tính toán những gì nó làm. Nó thường chỉ trong lớp cho thuận tiện. (Như vậy, những điều này cũng không phổ biến lắm.)
Hàm của X
Hãy nhớ lớp toán, "y là hàm của x , f(x)
?" Hãy áp dụng mã đó:
y = function(x)
Ngụ ý ở trên là vì x
có thể thay đổi, y
có thể thay đổi khi x
thay đổi. Đây là những gì có nghĩa là khi chúng ta nói rằng " y
là một chức năng của x
"
Điều gì sẽ y
được khi z
là 1
? 2
? 'FooBarBaz'
?
y
không phải là một chức năng của z
, vì vậy z
có thể là bất cứ điều gì và không ảnh hưởng đến kết quả của chức năng giả sử chúng ta function
là một hàm thuần túy. (Nếu nó truy cập z
như một biến toàn cục, thì đó không phải là một hàm thuần túy - đây là ý nghĩa của độ tinh khiết chức năng.)
Hãy ghi nhớ những điều trên khi bạn đọc các mô tả sau:
Phương pháp sơ thẩm
Một phương thức thể hiện là chức năng là một chức năng của một thể hiện . Hàm chấp nhận thể hiện ngầm định làm đối số cho nó và thể hiện được hàm sử dụng để xác định đầu ra của hàm.
Một ví dụ tích hợp của một phương thức cá thể là str.lower:
>>> 'ABC'.lower()
'abc'
str.lower
được gọi theo thể hiện của chuỗi và nó sử dụng thông tin có trong thể hiện để tìm ra chuỗi mới nào sẽ trả về.
Phương pháp lớp học:
Hãy nhớ rằng, trong Python, mọi thứ đều là một đối tượng. Điều đó có nghĩa là lớp là một đối tượng và có thể được truyền dưới dạng đối số cho hàm.
Một phương thức lớp là một hàm là một hàm của lớp . Nó chấp nhận lớp như là một đối số với nó.
Một ví dụ dựng sẵn là dict.fromkeys
:
>>> dict.fromkeys('ABC')
{'C': None, 'B': None, 'A': None}
Hàm ngầm biết lớp riêng của nó, hàm sử dụng lớp để ảnh hưởng đến đầu ra của hàm và nó tạo ra một lớp mới của lớp đó từ iterable. Một OrderedDict chứng minh điều này khi sử dụng cùng một phương thức:
>>> from collections import OrderedDict
>>> OrderedDict.fromkeys('ABC')
OrderedDict([('A', None), ('B', None), ('C', None)])
Phương thức lớp sử dụng thông tin về lớp (và không phải là một thể hiện của lớp đó) để ảnh hưởng đến loại lớp nào sẽ trả về.
Phương pháp tĩnh
Bạn đề cập đến một phương thức "không biết lớp của nó" - đây là một phương thức tĩnh trong Python. Nó chỉ được đính kèm để thuận tiện cho đối tượng lớp. Nó có thể tùy chọn là một chức năng riêng biệt trong một mô-đun khác, nhưng chữ ký cuộc gọi của nó sẽ giống nhau.
Một phương thức tĩnh là một hàm của cả lớp và đối tượng.
Một ví dụ tích hợp của một phương thức tĩnh là str.maketrans từ Python 3.
>>> str.maketrans('abc', 'bca')
{97: 98, 98: 99, 99: 97}
Đưa ra một vài đối số, nó tạo ra một từ điển không phải là một chức năng của lớp.
Nó thuận tiện vì str
luôn có sẵn trong không gian tên toàn cầu, vì vậy bạn có thể dễ dàng sử dụng nó với chức năng dịch:
>>> 'abracadabra'.translate(str.maketrans('abc', 'bca'))
'bcrbabdbcrb'
Trong Python 2, bạn phải truy cập nó từ string
mô-đun:
>>> 'abracadabra'.translate(str.maketrans('abc', 'bca'))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: type object 'str' has no attribute 'maketrans'
>>> import string
>>> 'abracadabra'.translate(string.maketrans('abc', 'bca'))
'bcrbabdbcrb'
Thí dụ
class AClass(object):
"""In Python, a class may have several types of methods:
instance methods, class methods, and static methods
"""
def an_instance_method(self, x, y, z=None):
"""this is a function of the instance of the object
self is the object's instance
"""
return self.a_class_method(x, y)
@classmethod
def a_class_method(cls, x, y, z=None):
"""this is a function of the class of the object
cls is the object's class
"""
return cls.a_static_method(x, y, z=z)
@staticmethod
def a_static_method(x, y, z=None):
"""this is neither a function of the instance or class to
which it is attached
"""
return x, y, z
Hãy khởi tạo:
>>> instance = AClass()
Bây giờ cá thể có thể gọi tất cả các phương thức:
>>> instance.an_instance_method('x', 'y')
('x', 'y', None)
>>> instance.a_static_method('x', 'y')
('x', 'y', None)
>>> instance.a_class_method('x', 'y')
('x', 'y', None)
Nhưng lớp thường không có ý định gọi phương thức cá thể, mặc dù nó được dự kiến sẽ gọi các phương thức khác:
>>> AClass.a_class_method('x', 'y')
('x', 'y', None)
>>> AClass.a_static_method('x', 'y')
('x', 'y', None)
>>> AClass.an_instance_method('x', 'y')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: an_instance_method() missing 1 required positional argument: 'y'
Bạn sẽ phải thông qua cá thể để gọi phương thức cá thể:
>>> AClass.an_instance_method(instance, 'x', 'y')
('x', 'y', None)