#-*- coding:utf8 -*- from types import MethodType # python类可以多继承 # 类中每一个实例方法都有一个self参数,调用时不需要传递该参数 # 类中实例变量不需要提前声明,直接使用self就可以调用 # 也可以随时为实例变量添加属性,此时添加的只属于该实例,其他实例不会有该属性 # 类中的私有方法和属性已双下划线开头, class MyClaxx(object): # 可以通过下面方式指定该类可以具有的属性及方法,__slots__定义的属性仅对当前类起作用,对继承的子类是不起作用的: __slots__=('name','age','nickname','getAge','sex','_high') def __init__(self,name,age): self.name=name self.age=age def getInfo(self): return self.age,self.name # 重写该方法后可以直接调用len()来获取长度 def __len__(self): return len( self.name )+len( str(self.age) ) # 下面定义两个get set方法,可以直接作为属性来使用 @property def high(self): print '@property get high' return self._high @high.setter def high(self,s): print '@sex.setter set high' self._high=s #不要使用self.high,否则会循环调用自身 # 创建MyClaxx实例,会自动调用 __init__(self,name,age):函数 ins=MyClaxx('zhang',10) print ins.getInfo() #(10, 'zhang') print ins.name,ins.age # zhang 10 # 为ins实例添加新属性并赋值,该类的其他实例不会具有该属性 ins.nickname='Tom' print ins.nickname # Tom ins2=MyClaxx('xiaoming',15) print ins2.getInfo() # (15, 'xiaoming') # print ins2.nickname ins2并没有nickname这个属性 print len(ins) # 7 print len(ins2) # 10 # 判断ins中有无nickname属性 print hasattr(ins, 'nickname') # True print hasattr(ins2, 'nickname') # False # 为ins2添加属性并赋值 setattr(ins2, 'nickname', 'defaultName') print hasattr(ins2, 'nickname') # True print ins2.nickname # defaultName #///////////////////////////////# def outMethod(self): return self.age ins.getAge=MethodType(outMethod, ins, MyClaxx) print ins.getAge() # 10 # print ins2.getAge() error,只为ins添加了getAge方法,ins2不具有 # 给类添加方法 MyClaxx.getAge=MethodType(outMethod, None, MyClaxx) print ins.getAge() # 10 print ins2.getAge() # 15 ins.sex='M' ins2.sex='F' # ins.weight=120 error,AttributeError: 'MyClaxx' object has no attribute 'weight # 类中已指定可以使用的属性,其他属性不允许添加 ins.high='180cm' # @sex.setter set high print ins.high # @property get high # 180cm