python 方法、实例方法、静态方法、类方法

十五、python 方法、实例方法、静态方法、类方法

方法

1、实例方法

第一个参数是self,绑定到实例

2、类方法

@classmethod

第一个参数是cls,绑定到类

3、静态方法

@staticmethod

和普通函数一样,无绑定

4、特殊方法,如__init__()

 

 

-----------------------------------

#之前定义的好多方法都是实例方法

#刚才写的就是实例方法

def __init__(self,id,name,email):

self.Id = id

self.Name = name

self.Email = email

#静态方法,

#静态方法和类方法的应用场景。因为python中是方法的多态,

但是怎么做才能满足多个不同参数的构造器呢?使用静态方法

----------------------------------------------

#类描述符定义

class Property(object):

    def __init__(self, propname, datatype, default=None):

        self._name = '_'+propname+'_'

        self._type = datatype

        self._default = default if default else self._type()

 

    def __get__(self, instance, owner):

        return getattr(instance,self._name,self._default)

 

    def __set__(self, instance, value):

        if not isinstance(value,self._type):

            raise TypeError('Type Error,must be %s type0' % self._type)

        setattr(instance,self._name,value)

 

    def __del__(self):

        pass

 

class Email(Property):

    def __init__(self,propname,default=None):

        super(Email,self).__init__(propname,str,default)

 

    def __set__(self, instance, value):

        if not isinstance(value,self._type):

            raise TypeError('Type Error,must be %s type0' % self._type)

        if not '@' in value:

            raise ValueError('Email address is not valid')

        setattr(instance,self._name,value)

 

 

 

class Chinese(object):

    Id = Property('id', int) #描述符必须是类属性,Id随便定义,和后面没有任何关系,它相当于对外访问提供的一个接口

    Name = Property('name', str)

    Email = Email('email')

 

    #注意:类的成员方法中,也必须使用类的描述符

    def __init__(self,id,name,email):

        self.Id = id

        self.Name = name

        self.Email = email

#######################方法相关代码###########################################

#想加一个这样的多态构造器是不可行的

#    def __init__(self,id):

#        self.Id = id

#man = Chinese(10,'aidon','abc@163.com')

 

    #定义一个静态方法

    @staticmethod

    def getPeopleByParent(mather,father):

        print mather,father

        return Chinese(100,'aidon','abc@163.com')  #相当于构造函数,最终创建咯实例对象

 

    @classmethod

    def getPeopleBySibling(cls,sibling):

        print sibling

        return cls(10,'bajie','bj@163.com')

 

aidon = Chinese.getPeopleByParent('mm','dd')  #掉用静态方法需要使用类

bajie = Chinese.getPeopleBySibling('aidon') #掉用类方法需要使用类,但他们的区别就是它可以得到cls类和继承后的不同

#交互式测试即可

aidon.Name

bajie.Name

 

#定义一个北京人的类继承中国人

class beijing(Chinese):

    pass

bjaidon = beijing.getPeopleByParent('bj','ch')  #掉用静态方法需要使用类

bjbajie = beijing.getPeopleBySibling('bjbajie') #掉用类方法需要使用类,但他们的区别就是它可以得到cls类和继承后的不同

#交互式测试(体现两者方法的不同)

type(bjaidon) #<class '__main__.Chinese'>  静态方法没有cls,所以没有类的特性,它的类就是父类的信息

type(bjbajie) #<class '__main__.beijing'>  它有cls,所以它还有类的特性,有类的信息

---------------------------------------------------------------

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大数据东哥(Aidon)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值