码迷,mamicode.com
首页 > 编程语言 > 详细

python 进阶

时间:2018-03-02 18:48:13      阅读:180      评论:0      收藏:0      [点我收藏+]

标签:nes   auth   garbage   输出   ica   comment   参数   privacy   ora   


1、python特殊函数:
以 __ 开头且以 __ 结尾。
xxxxxxxxxx
2
 
1

2、__getattr__ 和 __setattr__
__getattr__:拦截点号运算。当对未定义的属性名称和实例进行点号运算时,就会用属性名作为字符串调用这个方法。如果继承树可以找到该属性,则不调用此方法。
class empty:
    def__getattr__(self, attrname):
        if attrname =="age":  
            return 40;
        else:
            raise AttributeError, attrname

x = empty();
print(x.age)       #40  
print(x.name)      #error text omitted.....AttributeError, name  
xxxxxxxxxx
 
1
class empty:
2
    def__getattr__(self, attrname):
3
        if attrname =="age":  
4
            return 40;
5
        else:
6
            raise AttributeError, attrname
7
8
x = empty();
9
print(x.age)       #40  
10
print(x.name)      #error text omitted.....AttributeError, name  

__setattr__:会拦截所有属性的的赋值语句。如果定义了这个方法,self.arrt = value 就会变成self,__setattr__("attr", value).这个需要注意。当在__setattr__方法内对属性进行赋值是,不可使用self.attr = value,因为他会再次调用self,__setattr__("attr", value),则会形成无穷递归循环,最后导致堆栈溢出异常。应该通过对属性字典做索引运算来赋值任何实例属性,也就是使用self.__dict__[‘name‘] = value.
# Python实现属性私有化的首选方式:
class PrivateExc(Exception):  
    pass  
       
class Privacy:  
    def__setattr__(self, attrname, value):  
        if attrname inself.privates:  
            raisePrivateExc(attrname, self)  
        else:  
            self.__dict__[attrname]= value  

classTest1(Privacy):  
    privates= ["age"]  

classTest2(Privacy):  
    privates= ["name","age"]  
    def__init__(self):  
        self.__dict__["name"]= "sun"  

x =Test1()  
y =Test2()  
x.name = "Tom"         #执行成功  
x.age =20              #执行失败,产生异常,该属性在privates列表内  
y.name = "Mike"        #执行失败,产生异常,该属性在privates列表内  
y.age =20              #执行成功  
xxxxxxxxxx
1
25
1
# Python实现属性私有化的首选方式:
2
class PrivateExc(Exception):  
3
    pass  
4
       
5
class Privacy:  
6
    def__setattr__(self, attrname, value):  
7
        if attrname inself.privates:  
8
            raisePrivateExc(attrname, self)  
9
        else:  
10
            self.__dict__[attrname]= value  
11
12
classTest1(Privacy):  
13
    privates= ["age"]  
14
15
classTest2(Privacy):  
16
    privates= ["name","age"]  
17
    def__init__(self):  
18
        self.__dict__["name"]= "sun"  
19
20
x =Test1()  
21
y =Test2()  
22
x.name = "Tom"         #执行成功  
23
x.age =20              #执行失败,产生异常,该属性在privates列表内  
24
y.name = "Mike"        #执行失败,产生异常,该属性在privates列表内  
25
y.age =20              #执行成功  
class User():    
    def __init__(self, username, password):
        self._username = username
        self._password = password
        
    @property
    def username(self):
        return self._username

    @username.setter
    def username(self, username):
        self._username = username

boy = User("name","pass");
print(boy.username());
x
10
1
class User():    
2
    def __init__(self, username, password):
3
        self._username = username
4
        self._password = password
5
        
6
    @property
7
    def username(self):
8
        return self._username
9
10
    @username.setter
11
    def username(self, username):
12
        self._username = username
13
14
boy = User("name","pass");
15
print(boy.username());


4、上下文管理器:
with... as... 代码块
当越界后会有处理
#!/usr/bin/env python
# -*- coding:utf-8 -*-

__author__ = ‘Alpha_Meng‘

#---------------------------------------
with open("test.txt","w") as f:
    print(f.closed);
    f.write("hello word");
print(f.closed);  #此处不需要关闭文件,上下文管理器会自动关闭
xxxxxxxxxx
1
#!/usr/bin/env python
2
# -*- coding:utf-8 -*-
3
4
__author__ = ‘Alpha_Meng‘
5
6
#---------------------------------------
7
with open("test.txt","w") as f:
8
    print(f.closed);
9
    f.write("hello word");
10
print(f.closed);  #此处不需要关闭文件,上下文管理器会自动关闭
任何实现了 __enter__() 和 __exit__() 方法都可以做上下文管理。
所以自定义:
#!/usr/bin/env python
# -*- coding:utf-8 -*-

__author__ = ‘Alpha_Meng‘


class User(object):
    def __init__(self, username, password):
        self._username = username
        self._password = password


    @property
    def username(self):
        return self._username

    @username.setter
    def username(self, username):
        self._username = username

    @property
    def password(self):
        return self._password

    @password.setter
    def password(self, password):
        self._password = password

    def __enter__(self):
        print(‘auto do something before statements body of with executed‘)
        return self

    def __exit__(self, exc_type, exc_val, exc_tb):
        print(‘auto do something after statements body of with executed: ‘ + self._username);

if __name__ == ‘__main__‘:
    boy = User(‘shouke‘, ‘shouke2014‘)
    print(boy.password)
    with User(‘shouke‘, ‘2014‘) as user:
        print(user.password)
    print(‘---------end-----------‘)
    print(user.password)
xxxxxxxxxx
43
 
1
#!/usr/bin/env python
2
# -*- coding:utf-8 -*-
3
4
__author__ = ‘Alpha_Meng‘
5
6
7
class User(object):
8
    def __init__(self, username, password):
9
        self._username = username
10
        self._password = password
11
12
13
    @property
14
    def username(self):
15
        return self._username
16
17
    @username.setter
18
    def username(self, username):
19
        self._username = username
20
21
    @property
22
    def password(self):
23
        return self._password
24
25
    @password.setter
26
    def password(self, password):
27
        self._password = password
28
29
    def __enter__(self):
30
        print(‘auto do something before statements body of with executed‘)
31
        return self
32
33
    def __exit__(self, exc_type, exc_val, exc_tb):
34
        print(‘auto do something after statements body of with executed: ‘ + self._username);
35
36
if __name__ == ‘__main__‘:
37
    boy = User(‘shouke‘, ‘shouke2014‘)
38
    print(boy.password)
39
    with User(‘shouke‘, ‘2014‘) as user:
40
        print(user.password)
41
    print(‘---------end-----------‘)
42
    print(user.password)
43

5、闭包:
#!/usr/bin/env python
# -*- coding:utf-8 -*-

"""
closure example
"""

__author__ = "Alpha_Meng"

def line_conf(a, b):
    def line(x):
        return a * x + b;

    return line;


line1 = line_conf(1, 1);
line2 = line_conf(4, 5);
print(line1(5), line2(5));


>>> 6 25
xxxxxxxxxx
20
 
1
#!/usr/bin/env python
2
# -*- coding:utf-8 -*-
3
4
"""
5
closure example
6
"""
7
8
__author__ = "Alpha_Meng"
9
10
def line_conf(a, b):
11
    def line(x):
12
        return a * x + b;
13
14
    return line;
15
16
17
line1 = line_conf(1, 1);
18
line2 = line_conf(4, 5);
19
print(line1(5), line2(5));
20
21
22
>>> 6 25

6、装饰器:

不带参数的装饰器:
#!/usr/bin/env python
# -*- coding:utf-8 -*-

"""
decorator example
"""

__author__ = "Alpha_Meng";


# 旧的装饰器(不带参数)
def decorator(func):
    def new_func(a, b):
        print("input", a, b);
        return func(a, b);

    return new_func;

# 计算平方和
@decorator
def square_sum(a, b):
    return a ** 2 + b ** 2;

# 计算平方差
@decorator
def square_diff(a, b):
    return a ** 2 - b ** 2;

print(square_sum(4, 5));
print(square_diff(4, 5));

>>>> input 4 5
>>>> 41
>>>> input 4 5
>>>> -9
x
1
39
 
1
#!/usr/bin/env python
2
# -*- coding:utf-8 -*-
3
4
"""
5
decorator example
6
"""
7
8
__author__ = "Alpha_Meng";
9
10
11
# 旧的装饰器(不带参数)
12
def decorator(func):
13
    def new_func(a, b):
14
        print("input", a, b);
15
        return func(a, b);
16
17
    return new_func;
18
19
# 计算平方和
20
@decorator
21
def square_sum(a, b):
22
    return a ** 2 + b ** 2;
23
24
# 计算平方差
25
@decorator
26
def square_diff(a, b):
27
    return a ** 2 - b ** 2;
28
29
print(square_sum(4, 5));
30
print(square_diff(4, 5));
31
32
>>>> input 4 5
33
>>>> 41
34
>>>> input 4 5
35
>>>> -9

带参数的装饰器:
#!/usr/bin/env python
# -*- coding:utf-8 -*-

"""
decorator example
"""

__author__ = "Alpha_Meng";


# 新的装饰器(带参数)
def decorator_str(pre=""):
    # 旧的装饰器(不带参数)
    def decorator(func):
        def new_func(a, b):
            print(pre + "input", a, b);
            return func(a, b);
        return new_func;
    return decorator;

# 计算平方和
@decorator_str("Hi + ")
def square_sum(a, b):
    return a ** 2 + b ** 2;

# 计算平方差
@decorator_str("Hi - ")
def square_diff(a, b):
    return a ** 2 - b ** 2;

print(square_sum(4, 5));
print(square_diff(4, 5));

>>> Hi + input 4 5
>>> 41
>>> Hi - input 4 5
>>> -9
x
 
1
#!/usr/bin/env python
2
# -*- coding:utf-8 -*-
3
4
"""
5
decorator example
6
"""
7
8
__author__ = "Alpha_Meng";
9
10
11
# 新的装饰器(带参数)
12
def decorator_str(pre=""):
13
    # 旧的装饰器(不带参数)
14
    def decorator(func):
15
        def new_func(a, b):
16
            print(pre + "input", a, b);
17
            return func(a, b);
18
        return new_func;
19
    return decorator;
20
21
# 计算平方和
22
@decorator_str("Hi + ")
23
def square_sum(a, b):
24
    return a ** 2 + b ** 2;
25
26
# 计算平方差
27
@decorator_str("Hi - ")
28
def square_diff(a, b):
29
    return a ** 2 - b ** 2;
30
31
print(square_sum(4, 5));
32
print(square_diff(4, 5));
33
34
>>> Hi + input 4 5
35
>>> 41
36
>>> Hi - input 4 5
37
>>> -9

类装饰器:
#!/usr/bin/env python
# -*- coding:utf-8 -*-

"""
decorator class example
"""

__author__ = "Alpha_Meng";


def decorator(aClass):
    class NewClass():
        def __init__(self, age):
            self.total_display = 0;
            self.wrapped = aClass(age);

        def display(self):
            self.total_display += 1;
            print("total display are called ", self.total_display);
            self.wrapped.display();

    return NewClass;


@decorator
class Bird():
    def __init__(self,age):
        self.age = age;

    def display(self):
        print("the age is ", self.age);

bird = Bird(5);
for i in range(3):
    bird.display();
    
>>> total display are called  1
>>> the age is  5
>>> total display are called  2
>>> the age is  5
>>> total display are called  3
>>> the age is  5
 
1
#!/usr/bin/env python
2
# -*- coding:utf-8 -*-
3
4
"""
5
decorator class example
6
"""
7
8
__author__ = "Alpha_Meng";
9
10
11
def decorator(aClass):
12
    class NewClass():
13
        def __init__(self, age):
14
            self.total_display = 0;
15
            self.wrapped = aClass(age);
16
17
        def display(self):
18
            self.total_display += 1;
19
            print("total display are called ", self.total_display);
20
            self.wrapped.display();
21
22
    return NewClass;
23
24
25
@decorator
26
class Bird():
27
    def __init__(self,age):
28
        self.age = age;
29
30
    def display(self):
31
        print("the age is ", self.age);
32
33
bird = Bird(5);
34
for i in range(3):
35
    bird.display();
36
    
37
>>> total display are called  1
38
>>> the age is  5
39
>>> total display are called  2
40
>>> the age is  5
41
>>> total display are called  3
42
>>> the age is  5

7、内存管理

引用计数:
#!/usr/bin/env python
# -*- coding:utf-8 -*-

from sys import getrefcount;

"""
引用计数
reference count example
"""

__author__ = "Alpha_Meng"


# --------  引用计数  ---------------
a = [1,2,3];
print(getrefcount(a));

b = [a,a];
print(getrefcount(a));

# ---------对象引用对象,指向同一对象-------------

class FromObj():
    def __init__(self,to_obj):
        self.to_obj = to_obj;

x = [1,2,3];
y = FromObj(x);
print(id(x));
print(id(y.to_obj));
print(id(x) == id(y.to_obj));

>>> 2
>>> 4
>>> 473473615880
>>> 473473615880
>>> True
x
1
#!/usr/bin/env python
2
# -*- coding:utf-8 -*-
3
4
from sys import getrefcount;
5
6
"""
7
引用计数
8
reference count example
9
"""
10
11
__author__ = "Alpha_Meng"
12
13
14
# --------  引用计数  ---------------
15
a = [1,2,3];
16
print(getrefcount(a));
17
18
b = [a,a];
19
print(getrefcount(a));
20
21
# ---------对象引用对象,指向同一对象-------------
22
23
class FromObj():
24
    def __init__(self,to_obj):
25
        self.to_obj = to_obj;
26
27
x = [1,2,3];
28
y = FromObj(x);
29
print(id(x));
30
print(id(y.to_obj));
31
print(id(x) == id(y.to_obj));
32
33
>>> 2
34
>>> 4
35
>>> 473473615880
36
>>> 473473615880
37
>>> True


GC机制:
#!/usr/bin/env python
# -*- coding:utf-8 -*-

from sys import getrefcount;

"""
垃圾回收
garbage collection example

到达一个阈值会触发垃圾回收,阈值可以设置。


分代回收策略(分为三代,分为0代,1代,2代),类似java的GC

孤立“引用环”问题:
    对象在内存中被删除,需要一个条件:那就是该对象被删除且引用计数为0。
    当对象A引用对象B,而对象B又引用对象A,那么会形成一个环状引用。即使删除了对象A和对象B,也不会被删除。

    在python 使用了一个机制来解决:
    系统中会自动复制对象的引用计数,来单独保存计数。
    当对象被删除时,会将对象的所有引用计数都减去1,则即使是环状,也都减成了0。
"""

__author__ = "Alpha_Meng"

a = [];
b = [a];
a.append(b);

print(getrefcount(a))
print(getrefcount(b))

del a;
del b;

print(getrefcount(a))
print(getrefcount(b))

>>> 3
>>> 3
>>> Traceback (most recent call last):
>>>   File "F:/python_workspace/zxga/oop/garbage_collection.py", line 36, in <module>
>>>     print(getrefcount(a))
>>> NameError: name ‘a‘ is not defined
x
 
1
#!/usr/bin/env python
2
# -*- coding:utf-8 -*-
3
4
from sys import getrefcount;
5
6
"""
7
垃圾回收
8
garbage collection example
9
10
到达一个阈值会触发垃圾回收,阈值可以设置。
11
12
13
分代回收策略(分为三代,分为0代,1代,2代),类似java的GC
14
15
孤立“引用环”问题:
16
    对象在内存中被删除,需要一个条件:那就是该对象被删除且引用计数为0。
17
    当对象A引用对象B,而对象B又引用对象A,那么会形成一个环状引用。即使删除了对象A和对象B,也不会被删除。
18
19
    在python 使用了一个机制来解决:
20
    系统中会自动复制对象的引用计数,来单独保存计数。
21
    当对象被删除时,会将对象的所有引用计数都减去1,则即使是环状,也都减成了0。
22
"""
23
24
__author__ = "Alpha_Meng"
25
26
a = [];
27
b = [a];
28
a.append(b);
29
30
print(getrefcount(a))
31
print(getrefcount(b))
32
33
del a;
34
del b;
35
36
print(getrefcount(a))
37
print(getrefcount(b))
38
39
>>> 3
40
>>> 3
41
>>> Traceback (most recent call last):
42
>>>   File "F:/python_workspace/zxga/oop/garbage_collection.py", line 36, in <module>
43
>>>     print(getrefcount(a))
44
>>> NameError: name ‘a‘ is not defined

8、循环设计
    1、循环对象:包含一个next()方法的对象,在穷举完成后,抛出StopIteration错误。
>>> f = open("test.txt");
>>> next(f)
‘123\n‘
>>> next(f)
‘234\n‘
>>> next(f)
‘345‘
>>> next(f)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
StopIteration
xxxxxxxxxx
10
1
>>> f = open("test.txt");
2
>>> next(f)
3
‘123\n‘
4
>>> next(f)
5
‘234\n‘
6
>>> next(f)
7
‘345‘
8
>>> next(f)
9
Traceback (most recent call last):
10
  File "<stdin>", line 1, in <module>
11
StopIteration
    2、迭代器:    用iter() 函数返回迭代器对象。
>>> a = [1,2,3]
>>> b = iter(a)
>>> next(b)
1
>>> next(b)
2
>>> next(b)
3
>>> next(b)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
StopIteration
x
1
>>> a = [1,2,3]
2
>>> b = iter(a)
3
>>> next(b)
4
1
5
>>> next(b)
6
2
7
>>> next(b)
8
3
9
>>> next(b)
10
Traceback (most recent call last):
11
  File "<stdin>", line 1, in <module>
12
StopIteration
    3、生成器:帮助用户自定义构建循环对象。
                 yield关键字:程序碰到yield时,会返回;下一次再进入时,从该yield位置后的代码开始执行。
def gen():
    a = 10;
    yield a;
    a = a*10;
    yield a;
    a = 200;
    yield a;

for i in gen():
    print(i);
    
>>> 10
>>> 100
>>> 200
xxxxxxxxxx
10
1
def gen():
2
    a = 10;
3
    yield a;
4
    a = a*10;
5
    yield a;
6
    a = 200;
7
    yield a;
8
9
for i in gen():
10
    print(i);
11
    
12
>>> 10
13
>>> 100
14
>>> 200
       生成器表达式(generator expression):
# 生成器表达式:
G = (x**2 for x in range(3));
print(next(G))
print(next(G))
print(next(G))

>>> 0
>>> 1
>>> 4
xxxxxxxxxx
 
1
# 生成器表达式:
2
G = (x**2 for x in range(3));
3
print(next(G))
4
print(next(G))
5
print(next(G))
6
7
>>> 0
8
>>> 1
9
>>> 4

     4、表推导(list comprehension):
#!/usr/bin/env python
# -*- coding:utf-8 -*-

"""
表推导

list comprehension example

格式如下:

variable = [out_exp_res for out_exp in input_list if out_exp == 2]
列表对象 = [输出的表达式 for i in list if条件]

"""

__author__ = "Alpha_Meng"


list = [i**2 for i in range(10) if i%2 == 1];
print(list)

>>> [1, 9, 25, 49, 81]
xxxxxxxxxx
21
 
1
#!/usr/bin/env python
2
# -*- coding:utf-8 -*-
3
4
"""
5
表推导
6
7
list comprehension example
8
9
格式如下:
10
11
variable = [out_exp_res for out_exp in input_list if out_exp == 2]
12
列表对象 = [输出的表达式 for i in list if条件]
13
14
"""
15
16
__author__ = "Alpha_Meng"
17
18
19
list = [i**2 for i in range(10) if i%2 == 1];
20
print(list)
21
22
>>> [1, 9, 25, 49, 81]

    5、除了列表推导式 还有 字典推导式、集合推导式


9、动态类型:
    1、值传递 和 址传递(引用传递)
#!/usr/bin/env python
# -*- coding:utf-8 -*-

"""
参数传递
function pass example
"""

__author__ = "Alpha_Meng";

# ------ 值传递 ------
a = 1;

def change_integer(a):
    a = a + 1;
    return a;

# ------ 引用传递 ------
b = [1, 2, 3]

def change_list(b):
    b[0] = b[0] + 1
    return b;

print(a);
print(change_integer(a));
print(a);
print(b);
print(change_list(b));
print(b);

>>> 1
>>> 2
>>> 1
>>> [1, 2, 3]
>>> [2, 2, 3]
>>> [2, 2, 3]
x
1
#!/usr/bin/env python
2
# -*- coding:utf-8 -*-
3
4
"""
5
参数传递
6
function pass example
7
"""
8
9
__author__ = "Alpha_Meng";
10
11
# ------ 值传递 ------
12
a = 1;
13
14
def change_integer(a):
15
    a = a + 1;
16
    return a;
17
18
# ------ 引用传递 ------
19
b = [1, 2, 3]
20
21
def change_list(b):
22
    b[0] = b[0] + 1
23
    return b;
24
25
print(a);
26
print(change_integer(a));
27
print(a);
28
print(b);
29
print(change_list(b));
30
print(b);
31
32
>>> 1
33
>>> 2
34
>>> 1
35
>>> [1, 2, 3]
36
>>> [2, 2, 3]
37
>>> [2, 2, 3]

10、文件读写:
创建文件:
f = open(文件名,模式)

文件对象方法:
读取:f.read(N),f.readLine(),f.readlines()
写入:f.write(str)
关闭:f.close()
xxxxxxxxxx
1
创建文件:
2
f = open(文件名,模式)
3
4
文件对象方法:
5
读取:f.read(N),f.readLine(),f.readlines()
6
写入:f.write(str)
7
关闭:f.close()

11、OOP常见函数:
  • hasattr(o,f)                # 查看对象o是否包含f属性
  • getattr(o,f)                 # 获取对象o的f属性
  • setattr(o,f,new_f)      # 将对象o的f属性设置为new_f
  • delattr(o,f)                 # 删除对象o的f属性
  • isinstance(o,c)          # 对象o是否为类c的实例
  • issubclass(c.par)      # 类c是否为类par的子类











python 进阶

标签:nes   auth   garbage   输出   ica   comment   参数   privacy   ora   

原文地址:https://www.cnblogs.com/churao/p/8494296.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!