python之方法
文章目录
在 Python 中,方法可以分为 公有方法、私有方法、类方法 和 静态方法。它们的定义和调用方式有所不同,以下是详细介绍:
方法简介
1. 公有方法(Public Method)
- 定义:公有方法是类的普通方法,可以被类的实例和外部代码直接调用。
- 命名规则:方法名通常使用小写字母和下划线(如
my_method
)。 - 调用方式:通过类的实例调用。
示例
class MyClass:
def public_method(self):
print("This is a public method.")
# 创建实例
obj = MyClass()
# 调用公有方法
obj.public_method() # 输出: This is a public method.
2. 私有方法(Private Method)
- 定义:私有方法是类的内部方法,只能在类的内部调用,外部代码无法直接访问。
- 命名规则:方法名以双下划线
__
开头(如__private_method
)。 - 调用方式:只能在类的内部调用。
示例
class MyClass:
def __private_method(self):
print("This is a private method.")
def public_method(self):
print("This is a public method.")
self.__private_method() # 在类的内部调用私有方法
# 创建实例
obj = MyClass()
# 调用公有方法
obj.public_method()
# 输出:
# This is a public method.
# This is a private method.
# 尝试直接调用私有方法(会报错)
# obj.__private_method() # AttributeError: 'MyClass' object has no attribute '__private_method'
3. 类方法(Class Method)
- 定义:类方法是操作类本身的方法,而不是类的实例。通常用于工厂方法或操作类属性。
- 命名规则:方法名通常使用小写字母和下划线(如
my_class_method
)。 - 装饰器:使用
@classmethod
装饰器。 - 参数:第一个参数是
cls
,表示当前类。 - 调用方式:通过类名或实例调用。
示例
class MyClass:
class_attr = "Class Attribute"
@classmethod
def class_method(cls):
print(f"This is a class method. cls = {cls}, class_attr = {cls.class_attr}")
# 通过类名调用类方法
MyClass.class_method()
# 输出: This is a class method. cls = <class '__main__.MyClass'>, class_attr = Class Attribute
# 也可以通过实例调用
obj = MyClass()
obj.class_method()
# 输出: This is a class method. cls = <class '__main__.MyClass'>, class_attr = Class Attribute
4. 静态方法(Static Method)
- 定义:静态方法与类的实例无关,类似于普通函数,但定义在类的命名空间中。
- 命名规则:方法名通常使用小写字母和下划线(如
my_static_method
)。 - 装饰器:使用
@staticmethod
装饰器。 - 参数:不需要
self
或cls
参数。 - 调用方式:通过类名或实例调用。
示例
class MyClass:
@staticmethod
def static_method(x):
print(f"This is a static method. x = {x}")
# 通过类名调用静态方法
MyClass.static_method(10) # 输出: This is a static method. x = 10
# 也可以通过实例调用
obj = MyClass()
obj.static_method(10) # 输出: This is a static method. x = 10
5. 总结对比
方法类型 | 定义方式 | 参数 | 调用方式 | 用途 |
---|---|---|---|---|
公有方法 | 普通方法 | self | 通过实例调用 | 操作实例属性或方法 |
私有方法 | 方法名以 __ 开头 | self | 只能在类的内部调用 | 类的内部实现细节 |
类方法 | 使用 @classmethod 装饰器 | cls | 通过类名或实例调用 | 操作类属性或实现工厂方法 |
静态方法 | 使用 @staticmethod 装饰器 | 无 | 通过类名或实例调用 | 与类无关的工具函数 |
6. 完整示例
以下是一个包含所有方法类型的完整示例:
class MyClass:
class_attr = "Class Attribute"
def __init__(self, value):
self.instance_attr = value
# 公有方法
def public_method(self):
print("This is a public method.")
self.__private_method() # 调用私有方法
# 私有方法
def __private_method(self):
print("This is a private method.")
# 类方法
@classmethod
def class_method(cls):
print(f"This is a class method. cls = {cls}, class_attr = {cls.class_attr}")
# 静态方法
@staticmethod
def static_method(x):
print(f"This is a static method. x = {x}")
# 创建实例
obj = MyClass("Instance Attribute")
# 调用公有方法
obj.public_method()
# 输出:
# This is a public method.
# This is a private method.
# 调用类方法
MyClass.class_method()
# 输出: This is a class method. cls = <class '__main__.MyClass'>, class_attr = Class Attribute
# 调用静态方法
MyClass.static_method(10) # 输出: This is a static method. x = 10
7. 注意事项
- 私有方法:虽然 Python 没有严格的访问控制,但通过双下划线
__
可以避免方法被外部直接调用。 - 类方法和静态方法:类方法通常用于操作类属性或实现工厂方法,而静态方法通常用于与类无关的工具函数。
编程比赛中常用的方法定义与调用
公有方法之间的调用
在一个类里面,公有方法必须要有参数
self
,然后公有方法之间的相互的调用使用的是self.方法名
例子如下:
class Solution:
# 公用方法,带有参数self
def numSub(self,nums:List[int],goal:int ) ->int :
left = count = ans = 0
for right,i in enumerate(nums):
count+=i
while count >= goal and left <= right:
count-=nums[left]
left+=1
ans += left
return ans
def numSubarraysWithSum(self, nums: List[int], goal: int) -> int:
# 打算使用越长越好的方法,求解出和 >= goal 和 >= goal+1的情况
return self.numSub(nums,goal) - self.numSub(nums,goal+1)
嵌套方法
和上面的代码的功能一样:
class Solution:
def numSubarraysWithSum(self, nums: List[int], goal: int) -> int:
# 打算使用越长越好的方法,求解出和 >= goal 和 >= goal+1的情况
# 定义嵌套方法,并不使用 self参数
def numSub(nums:List[int],goal:int ) ->int :
left = count = ans = 0
for right,i in enumerate(nums):
count+=i
while count >= goal and left <= right:
count-=nums[left]
left+=1
ans += left
return ans
return numSub(nums,goal) - numSub(nums,goal+1)
原文地址:https://blog.csdn.net/weixin_74850661/article/details/145233372
免责声明:本站文章内容转载自网络资源,如侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!