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