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

来源:互联网 发布:mac 查看剩余空间 编辑:程序博客网 时间:2024/05/29 08:59

添加方法

  • 正常情况下,当我们定义了一个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
原创粉丝点击