• Python之面向对象:方法


    一、类的三种方法
    1、实例方法
    def func(self):
    由对象调用;至少一个self参数;执行普通方法时,自动将调用该方法的对象赋值给self;
    只能通过实例调用
     
    2、静态方法
    @staticmethod
    def add():
    由类调用,不需要对象;无默认参数。静态方法跟所在的类没有任何关系,也不能引用类里面的属性和方法
    静态方法既可以直接使用类名去调用,还可以使用类的实例去调。
     
    3、类方法
    不用创建实例,就可以使用的方法
    @classmethod (装饰器)
    def func1(cls): cls指向类
    由类调用; 至少一个cls参数;执行类方法时,自动将调用该方法的类复制给cls;
    eg:
    #coding=utf-8
    class Person(object):
    id = 12 #类静态成员在这儿定义,注意缩进
    def __init__( self,name ):
    self.name = name
    self.__inName = 'ads'
    @classmethod #类方法定义,用注解方式说明
    def up(cls,a ): #这儿是cls,不是self
    print cls,cls.__name__
    return a+1
    #创建类的实例
    p = Person( "alpha" )
    #调用类方法
    print Person.up(20) #类名直接调用
    print p.up(12) #通过实例对象调用 (实例可以调用类方法)
     
    4、私有方法
    类中方法名前面有两个下划线,表示是Python中的私有方法,类似于java中的private,不能在类外部调用(如__setId()),在类内部调用语法: self.__private_methods。
    eg:
    #coding=utf-8
    class Person(object):
    id = 12 #类静态成员在这儿定义,注意缩进
    def __init__(self,name):
    self.name = name
    self.__inName = 'ads'
    def __setId(self,id): #隐藏方法
    Person.id = id * 2
    def getId(self):
    self.__setId(18) #类内部调用隐藏方法
    return Person.id
    p = Person("prel")
    print p.getId() 通过类中的方法使用类的私有方法功能
     
    5、类的构造方法
    class Foo(object):
    def __inti__(self,*args): 使用了元祖参数,对于变量不确定的情况。构造方法
    if len(args)==2:
    self.name=name
    self.age=age
    else:
    print 'no salary'
    def bar(self):
    pass
    obj=Foo() 实例化的时候,会执行__init__()这个构造方法
     
    二、前三种方法对比
    1、相同点和不同点
    相同点:对于所有的方法而言,均属于类(非对象)中,所以,在内存中也只保存一份。
    不同点:方法调用者不同、调用方法时自动传入的参数不同。
     
    三、前三种方法的总结
    类方法可以被类对象或实例调用,实例方法只能被实例调用,它只属于类的单个实例拥有,静态方法两者都能调用,它在类和实例间共享。Python实现了一定的灵活性使得类方法和静态方法,都能够被实例和类二者调用。
    所以三者主要区别在于参数传递上的区别,实例方法隐含传的参数是类实例self,而类方法隐含传递的参数是类本身cls,而静态方法无隐含参数,主要为了类实例也可以直接调用静态方法。
  • 相关阅读:
    直道相思了无益 你既无心我便休
    c#与XML
    ASP.NET读取Excel文件的三大方法浅析
    当前标识(NT AUTHORITY\NETWORK SERVICE)没有对“C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files”的写访问权限。
    比较这2段HTML代码
    编码的一点思维
    代码修改的一个范例
    在aspx.cs中不出现中文?
    规则先行
    设计模式——UML简介
  • 原文地址:https://www.cnblogs.com/emily-qin/p/7059160.html
Copyright © 2020-2023  润新知