python六面向对象高级特性

发布时间:2018-11-18  栏目:Python  评论:0 Comments

率先,需要明白的凡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地图