Python基本学习-类的属性

经典类和新式类

基本语法
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(解决上面属性设置冗余问题)
    • getattr
    • setattr
    • delattr
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
  • 描述符:可以用作类的属性,定义了描述符的类可作为另一个类的属性
    • get
    • set
    • delete
class PositiveNum(object):
    def __init__(self,value):
        self.val = value
    # def __init__(self):
        #self.default = 1
        #self.data =  {}
    def __get__(self,instance,owner):
        #instance = a,b
        #owner = Car
        return self.val
        #return self.data.get(instance,self.default)
    def __set__(self,instance,value):
        #instance  = a,b
        try:
            assert int(value)>0
            self.val = value
            #self.data[instance] = 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
        #self.data[instance]

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
#a = Car(1.2,1.4,1.5,u'hh')
#b = Car(2.2,1.4,1.5,u'hh')
#?访问的变量为Car的属性,那如何区分a和b呢?针对不同的instance维护不同的值
方法
继承和组合
多态
特殊方法
wxpython
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值