python 方法的实例_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) #  静态方法没有cls,所以没有类的特性,它的类就是父类的信息

type(bjbajie) #  它有cls,所以它还有类的特性,有类的信息

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值