自学内容网 自学内容网

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 装饰器。
  • 参数:不需要 selfcls 参数。
  • 调用方式:通过类名或实例调用。
示例
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)!