python六面向对象高级特性

先是,需要掌握的凡python是一致种植解释性语言专业,他可以由c、java或者其他语言来兑现。在python的规范被,变量是链接式的。举个例子来说,内存中之靶子和变量就比如是给内存对象贴变量誉为标签而无是深受变量盒子装东西(数值信息)。或者说是叫目标分配变量名,而不是让变量赋值。因为python对象在实施赋值之前就是曾创造存在了之。

高档特性

  1. ##### 给实例绑定一个性:

>>> s = Student()
>>> s.name = 'Michael' # 动态给实例绑定一个属性
>>> print s.name
Michael

>>> def set_age(self, age): # 定义一个函数作为实例方法
...     self.age = age
...
>>> from types import MethodType
>>> s.set_age = MethodType(set_age, s, Student) # 给实例绑定一个方法
>>> s.set_age(25) # 调用实例方法
>>> s.age # 测试结果
25

深受一个实例绑定的措施,对其他一个实例是不起作用的,为了给持有实例都绑定方法,可以于class绑定方法。

>>> def set_score(self, score):
...     self.score = score
...
>>> Student.set_score = MethodType(set_score, None, Student)
  1. ##### __slot__

在定义class的时,定义一个异的__slots__变量,来界定该class能加上的习性:__slots__概念之习性独针对脚下类似起作用,对持续的子类是不起作用

>>> class Student(object):
...     __slots__ = ('name', 'age') # 用tuple定义允许绑定的属性名称
...

1.@property

class Student(object):

    @property
    def score(self):
        return self._score

    @score.setter
    def score(self, value):
        if not isinstance(value, int):
            raise ValueError('score must be an integer!')
        if value < 0 or value > 100:
            raise ValueError('score must between 0 ~ 100!')
        self._score = value
#测试
>>> s = Student()
>>> s.score = 60 # OK,实际转化为s.set_score(60)
>>> s.score # OK,实际转化为s.get_score()
60
>>> s.score = 9999
Traceback (most recent call last):
  ...
ValueError: score must between 0 ~ 100!

class Student(object):

    @property
    def birth(self):
        return self._birth

    @birth.setter
    def birth(self, value):
        self._birth = value

    @property
    def age(self):
        return 2014 - self._birth
#上面的birth是可读写属性,而age就是一个只读属性,
#因为age可以根据birth和当前时间计算出来。
  1. ##### 多继承

Mixin的目的就是叫一个像样增加多个作用,这样,在设计类的时,我们先考虑通过多重继承来成多个Mixin的功能,而休是计划多层次的复杂的连续关系。

  1. ##### 定制类

type动态创建类:

def fn(self,name='world'):
    print('hello lzy %s' % name)

 Hello = type('Hello',(object,),dict(hello=fn))
h = Hello()
h.hello()

设若创一个class对象,type()函数依次传入3单参数:
class的名称;
后续的父类集合,注意Python支持多再继承,如果只有出一个父类,别忘了tuple的单元素写法;
class的计名称及函数绑定,这里我们把函数fn绑定到方法名hello上。
由此type()函数创建的类似以及一直写class是了等同的,因为Python解释器遇到class定义时,仅仅是扫描一下class定义的语法,然后调用type()函数创建出class。

  1. ##### 使用元类

对象标识与变量名

id()返回对象的标识,cpython中id()返回的是绝无仅有的内存地址,变量名则是一个便民理解的号。

is和==的区别

is需要值和内存地址都抵,==只待价值等。检查一下id()就可以了。
is比==更快,不可知重载,直接比较的是id。

变量的可变性

当基础阶段,很多课程都见面涉嫌,元祖是不可变的数据类型,所以没加塞儿和去的操作,只能一不好定义。但深究这个题目起来,其实元祖只是以援上不能够转,但援的目标是可变的,就招元祖的值会跟着列表发生变化。浅复制时,多个变量引用同一列表地址,那么改变一个其他也会转移。深复制是于内存中再开发一个区域,将原来的目标包括中为对象引用的内容,一同复制到新的区域,并建新的援。引用变量的可变性看的凡最小目标单位之项目,比如不可变元组中来可转换列表对象,列表就是太小之单位,要拘留它的可变性。列表是可变的,这种特征使得在针对同一个列表对象的情事下,列表实际的长度以及价值是可更改之。对另外的种类对象一般不可变,也就是未会见发上述变化。

尽深的威胁在,将列表作为参数传为类措施的下,类变量和参数绑定了跟一个靶,执行完毕返回后原本的不胫而走参数的目标有了转变。除了刻意而错过改变传入的列表,否则应当在即时之前深复制一个副本,不影响原本的变量的采用。

创办列表的几乎种写法

a = [1,2,3]
b=a
b is a
>>True

c = list(a)
c is a
>>False

d = a[:]
d is a
>>False

看似上面下b=a这样的法子创造的列表,其实仅仅是新建了一个援,并不曾新建一个目标。如果转a、b其中一个,另一个晤趁反。

深复制和浅复制的切切实实分

copy模块可成功浅复制和深复制,分别对应措施copy()和deepcopy()。其中,deepcopy()可以好对含有循环引用的对象的正片。

切切实实可以用底的a分别举行少种植拷贝,会发现中间深拷贝得到的a[1]的内容及另外两者是例外一样的。

a = [1,[2,3],(4,5)]

采取简单种植拷贝分别复制后翻结果。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图