#-*- 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