经典类和新式类
基本语法
class class_name (base_class) :
class_var
def methods (self,args) :
statments
经典类(无父类)与新式类(有父类)的区别 新式类含slots :定义一个曹,slots = (‘x’,’y’),字典属性只能是xy,不能添加其他属性,经典类可以添加 继承顺序,super new ,getattribute
属性和封装
class car (object) :
country = u'中国'
def __init__ (self,length,width,owner=None) :
self.owner = owner
self.length = length
self.width = width
私有属性
__xxx: 不能直接访问 _xxx : 直接访问不合理 xxx :系统自带属性
class car (objects) :
def __init__ (self,length,width,owner=None) :
self._owner = owner
self._length = length
self._width = width
def getOwner (self) :
return self._owner
def setOwner (self,value) :
assert value>0 ,"owner must larger than 0"
self._owner = value
装饰器和描述符
@propery:相当于给方法定义了get和set属性,可以对方法以属性的方式访问 @xxx.setter @xxx.deleter
class car (objects) :
def __init__ (self,length,width,owner=None) :
self._owner = owner
self._length = length
self._width = width
@property
def owner (self) :
return self._owner
@owner.setter
def owner (self,value) :
assert value>0 ,"owner must larger than 0"
self._owner = value
@owner.deleter
def owner (self) :
self.owner = None
属性和封装-getattr,setattr(解决上面属性设置冗余问题)
class car (objects) :
def __init__ (self,length,width,owner=None) :
self._owner = owner
self._length = length
self._width = width
def __getattr__ (self,name) :
print("__getattr__" ,name)
return self.__dict__.__get(name,None )
def __setattr__ (self,name,value) :
if name != 'owner' :
assert value>0 , name+"must larger than 0"
self.__dict__[name] = value
def __delattr__ (self,name) :
if name =='owner' :
self.__dict__[name]=None
getattr 和slots 搭配 slots 不能限制属性的访问,因为在没有找到属性的情况下,会自动访问getattr
class car (objects) :
country = u'中国'
__slots__ = ('length' ,'width' ,'owner' ,'__dict__' )
def __init__ (self,length,width,owner=None) :
self._owner = owner
self._length = length
self._width = width
def __getattr__ (self,name) :
print("__getattr__" ,name)
assert name in self.__slots__,"not have this property"
return self.__dict__.__get(name,None )
def __setattr__ (self,name,value) :
assert name in self.__slots__,"not have this property"
if name != 'owner' :
assert value>0 , name+"must larger than 0"
self.__dict__[name] = value
def __delattr__ (self,name) :
if name =='owner' :
self.__dict__[name]=None
描述符:可以用作类的属性,定义了描述符的类可作为另一个类的属性
class PositiveNum (object) :
def __init__ (self,value) :
self.val = value
def __get__ (self,instance,owner) :
return self.val
def __set__ (self,instance,value) :
try :
assert int(value)>0
self.val = value
except AssertionError:
print("ERROR" + str(value)+"is not positive" )
except :
print("ERROR" + str(value)+"is not a number" )
def __delete__ (self,instance) :
self.val = None
class Car (object) :
country = u'中国'
length = PositiveNum(0 )
width = PositiveNum(0 )
def __init__ (self,length,width,owner=None) :
self.length = length
self.width = width
self.owner = owner
方法
继承和组合
多态
特殊方法
wxpython