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','[email protected]')

 

    #定义一个静态方法

    @staticmethod

    def getPeopleByParent(mather,father):

        print mather,father

        return Chinese(100,'aidon','[email protected]')  #相当于构造函数,最终创建咯实例对象

 

    @classmethod

    def getPeopleBySibling(cls,sibling):

        print sibling

        return cls(10,'bajie','[email protected]')

 

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,所以它还有类的特性,有类的信息

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

发布了49 篇原创文章 · 获赞 60 · 访问量 18万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章