python学习(七):面向对象(二)

添加方法

  • 正常情况下,当我们定义了一个class,创建了一个class的实例后,我们可以给该实例绑定任何属性和方法;
  • 还可以尝试给实例绑定一个方法,但是,给一个实例绑定的方法,对另一个实例是不起作用的;
  • 为了给所有实例都绑定方法,可以给class绑定方法,给class绑定方法后,所有实例均可调用(需要from types import MethodType)。

限制属性

  • 为了达到限制的目的,Python允许在定义class的时候,定义一个特殊的slots变量,来限制该class实例能添加的属性;
  • slots定义的属性仅对当前类实例起作用,对继承的子类是不起作用的;
  • 除非在子类中也定义slots,这样,子类实例允许定义的属性就是自身的slots加上父类的slots
  • slots本质为一个元组tuple,为类属性。

@property 装饰器

 class property(object):
    """
    property(fget=None, fset=None, fdel=None, doc=None) -> property attribute
    fget is a function to be used for getting an attribute value, and likewise
    fset is a function for setting, and fdel a function for del'ing, an attribute.  Typical use is to define a managed attribute x:

    class C(object):
        def getx(self): return self._x
        def setx(self, value): self._x = value
        def delx(self): del self._x
        x = property(getx, setx, delx, "I'm the 'x' property.")

    Decorators make defining new properties or modifying existing ones easy:

    class C(object):
        @property
        def x(self):
            "I am the 'x' property."
            return self._x
        @x.setter
        def x(self, value):
            self._x = value
        @x.deleter
        def x(self):
            del self._x
    """
  • 同一属性的三个函数名要相同;
  • 函数property的基本功能就是把类中的方法当作属性来访问;
  • 利用property装饰器,让成员函数称为只读的,不定义@x.setter即可;
  • @property广泛应用在类的定义中,可以让调用者写出简短的代码,同时保证对参数进行必要的检查,这样,程序运行时就减少了出错的可能性。

类型检查

    print(issubclass(bool,int))
    print(isinstance(3,int))
    print(type([])==list)

type()就是一个最实用又简单的查看数据类型的方法。type()是一个内建的函数,调用它就能够得到一个反回值,从而知道想要查询的对像类型信息,但是不能用于继承中类型的判断,只能用于基本类型的判断。
Python 有两个用于继承的函数:
使用isinstance()来检查实例类型:isinstance(obj, int)只有obj.class是int或者是从int派生的类时才为True。
使用issubclass()来检查类的继承: issubclas(bool, int)是True因为bool是int的子类。然而,issubclass(float, int)为False,因为float不是int的子类。


多重继承

class DerivedClassName(Base1, Base2...MixIn1,MixIn2...):
    <statement-1>
    .
    .
    .
    <statement-N>
  • 对于大多数用途,在最简单的情况下,你可以认为继承自父类的属性搜索是从左到右的深度优先搜索,不会在同一个类中搜索两次,即使层次会有重叠。因此,如果在DerivedClassName中找不到属性,它搜索Base1,然后(递归)基类中的Base1,如果没有找到,它会搜索base2,依此类推。通过多重继承,一个子类就可以同时获得多个父类的所有功能。

  • MixIn的目的就是给一个类增加多个功能,这样,在设计类的时候,我们优先考虑通过多重继承来组合多个MixIn的功能,而不是设计多层次的复杂的继承关系。这样一来,我们不需要复杂而庞大的继承链,只要选择组合不同的类的功能,就可以快速构造出所需的子类。

  • 但通常混入 Mixin 的类和 Mixin 类本身不是 is-a 的关系,混入 Mixin 类是为了添加某些(可选的)功能。自由地混入 Mixin 类就可以灵活地为被混入的类添加不同的功能。作为Mixin类,需要满足以下条件:
    不能单独生成实例对象,属于抽象类;不能继承Mixin以外的类!
    因为有以上限制,Mixin类通常作为功能模块使用,在需要该功能时“混入”,而且不会使类的关系变得复杂(比如,同名方法到底从哪个父类继承)。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值