python中的实例方法、静态方法、类方法、私有方法和保护方法

实例方法:
实例方法顾名思义就是实例对象调用的方法,是最普遍最常用的类中的方法:

class animal(object):
    def __init__(self):
        pass
    def talk(self):
        print("in animal talk")
dog=animal()
dog.talk()      #方法1
animal.talk(dog) #方法2

实例方法的调用有两种形式,但都是先将类实例化。方法1是最常见的,先定义一个dog实例,再通过dog实例调用animal类中的实例方法。方法2原理同方法1,talk方法中的self形参传递的其实就是实例本身,既也相当于定义了一个dog实例。
静态方法:
静态方法是类中的函数,不需要实例。静态方法主要是用来存放逻辑性的代码,主要是一些逻辑属于类,但是和类本身没有交互,即在静态方法中,不会涉及到类中的方法和属性的操作。可以理解为将静态方法存在此类的名称空间中。事实上,在python引入静态方法之前,通常是在全局名称空间中创建函数。

class animal(object):
    def __init__(self):
        pass
    @staticmethod
    def talk():
        print("in animal talk")
dog=animal()
dog.talk()
animal.talk()

可以看见静态方法不包含self形参,既不通过实例化也能调用,当然通过实例也能调用。一般静态方法用来处理类中的逻辑判断或者运算。
类方法:
类方法是将类本身作为对象进行操作的方法。他和静态方法的区别在于:不管这个方式是从实例调用还是从类调用,它都用第一个参数把类传递过来。

class A(object):
    def __init__(self,str):
        print(str)
    @classmethod
    def link_str(cls,*args):
        """
        将string字符串组合
        :param args:strs
        :return:str
        """
        temp_tuple = args
        result = ""
        for i in range(len(temp_tuple)):
            result = result + temp_tuple[i]
        return cls(result)

obj_1=A("aa")
obj_2=A.link_str("aa","bb","cc") #相当于obj_2=A(link_str())

运行结果如下所示:

aa
aabbcc

可以看到class A中,当实例化A时都会print 输入的string,正常实例化obj_1,输出”aa“,如果我输入的参数有多个,或者说我输入参数是不同类型的,需要先对输入参数进行预处理,那么我们就可以通过类方法去实现。可以看见输入“aa”,“bb”,“cc”三个string,先通过link_str对输入的三个参数进行组合,将组合后的string作为A中init实例化的参数传入。
私有方法
只能允许这个类本身进行访问了,连子类也不可以用于命名一个类属性(类变量),调用时名字被改变(在类FooBar内部,__boo变成_FooBar__boo,如self._FooBar__boo)

class A(object):
    def __init__(self):
        print("in __init__")
        self.__private()
    def __private(self):
        print("in__private__")

class B(A):
    pass

print(A.__dict__) #查看类的属性(类中方法也是类的属性)

结果如下:

{'__module__': '__main__', '__init__': <function A.__init__ at 0x0000019E1FEDB730>, '_A__private': <function A.__private at 0x0000019E1FEDB7B8>, '__dict__': <attribute '__dict__' of 'A' objects>, '__weakref__': <attribute '__weakref__' of 'A' objects>, '__doc__': None}

如果在一个方法前面加上了”_”那么这个方法就变为了这个类私有方法,在运行结果中找不到__private这个方法,只找到了_A__private,python其实这个方法名上加上了”类名”,所有当我们之间调用时会出现找不到该属性的错误。私有方法一般只在类内部进行调用。如果想要在类外强制调用那么可以通过调用_A__private这个方法来调用(一般不建议强制调用)
保护方法:
保护方法很好理解就是以单下划线开头的表示的是 protected 类型的变量,即保护类型只能允许其本身与子类进行访问,不能用于 from module import *。很好的体现面向对象编程的封装,继承两大特性。

python中类中的方法其实也是类属性的一种(动态属性),区别于类的静态属性的是方法可以有行参输入。

  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值