博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Python全栈开发day9
阅读量:6861 次
发布时间:2019-06-26

本文共 4537 字,大约阅读时间需要 15 分钟。

 

一、面向对象进阶

  1.利用python反射查看面向对象成员

      对于对象:反射既可以找对象,类的成员

      对于类:反射只能找类中的成员

    

  2.利用反射操作模块(查找类,创建对象,查找对象中字段)

1
2
3
4
5
6
7
8
9
#!/bin/env python
# -*- coding:utf-8 -*-
moudel
=
__import__
(
'lianxi'
,fromlist
=
True
)
# 导入模块
c_name
=
getattr
(moudel,
'foo'
)     
# 到模块中查找类
obj
=
c_name(
'wangxiang'
)      
# 根据类创建对象
val
=
getattr
(obj,
'name'
)      
# 到对象中找字段的值
print
(val)
C:\Python35\python.exe H:
/
PyCharm
/
Python
/
PY_learn
/
lx3.py
wangxiang

  3.类的静态字段

1
2
3
4
5
6
7
8
9
#!/bin/env python
# -*- coding:utf-8 -*-
class
foo:
    
country
=
'中国'         
# 静态字段(将每个对象中都重复的内容放在类中,保存一份)
    
def
__init__(
self
, name):
        
self
.name
=
name       
# 普通字段
 
    
def
shaw(
self
):    
# 普通方法
        
print
(
'I am %s'
%
name)

  注意:

  类和对象都可以访问:静态字段,静态方法,普通字段,类方法,类的方法

      推荐:  

         1、谁的成员谁访问

              类的成员,用类来访问

              对象的成员,用对象来访问

             除了类中的方法(不要用类去访问类中的方法)

         2.通过类访问:静态字段和静态方法,类方法。通过对象访问:普通字段,类的方法

  4、类的静态方法

    静态方法用类来访问

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#!/bin/env python
# -*- coding:utf-8 -*-
class
foo:
    
country
=
'中国'         
# 静态字段(将每个对象中都重复的内容放在类中,保存一份)
    
def
__init__(
self
, name):
        
self
.name
=
name       
# 普通字段
 
    
@staticmethod
    
def
test(arg1,arg2):            
# 静态方法,可以传递任意参数
        
print
(
'test %s %s'
%
(arg1,arg2))
 
    
def
shaw(
self
):    
# 普通方法
        
print
(
'I am %s'
%
name)
 
foo.test(
'alices'
,
'sam'
)         
# 通过类执行静态方法
C:\Python35\python.exe H:
/
PyCharm
/
Python
/
PY_learn
/
lianxi.py
test alices sam

  5.类方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#!/bin/env python
# -*- coding:utf-8 -*-
class
foo:
    
country
=
'中国'         
# 静态字段(将每个对象中都重复的内容放在类中,保存一份)
    
def
__init__(
self
, name):
        
self
.name
=
name       
# 普通字段
 
    
@classmethod                   
# 类方法,其中cls参数代表当前类名(这个参数必须要有)
    
def
acc(
cls
):
        
print
(
'acc'
,
cls
)
 
foo.acc()
C:\Python35\python.exe H:
/
PyCharm
/
Python
/
PY_learn
/
lianxi.py
acc <
class
'__main__.foo'
>               
# cls即类名

  6python 类特性

    获取值

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#!/bin/env python
# -*- coding:utf-8 -*-
class
foo:
    
def
__init__(
self
,name):
        
self
.name
=
name
 
    
def
start(
self
):
        
temp
=
'%s sb'
%
self
.name
        
return
temp
 
    
@property              
# python特性,将方法伪造成一种字段(执行时,无需加括号)
    
def
end(
self
):
        
temp
=
'%s sb'
%
self
.name
        
return
temp
 
obj
=
foo(
'sam'
)
ret
=
obj.start()
val
=
obj.end              
# 执行时,无需加括号(即不能加参数)
print
(ret)
print
(val)
C:\Python35\python.exe H:
/
PyCharm
/
Python
/
PY_learn
/
lx3.py
sam sb
sam sb

    设置数值:

    

  7.面向对象小结:

      面向对象三大特性:封装 ,继承,多态

      面向对象成员:

         字段:静态字段(每个对象都有一份),普通字段(每个对象都是不同的数据)

         方法:静态方法(无需使用对象封装的内容),类方法(和静态方法相同,会自动添加类名),普通方法(使用对象中的数据)

         特性:普通特性(将方法伪造成字段

      快速判断谁执行:

         self ---> 对象调用

         无self ---> 类调用

  8python成员修饰符

      成员修饰符:公有和私有

      私有内容,在类外部无法调用(包括其子类),只能在当前class内部调用

1
2
3
4
5
6
7
8
9
10
11
12
class
foo:
    
va
=
'vava'
    
__vale
=
'vale'    
# 私有内容,在外部无法调用(包括子类),只能在当前class内部调用
 
    
def
__init__(
self
,name):
       
self
.__name
=
name
 
    
def
start(
self
):
        
print
(foo.__vale)
 
obj
=
foo(‘sam’)
obj.start()

      Python外部访问私有内容(不推荐):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#!/bin/env python
# -*- coding:utf-8 -*-
class
foo:
    
va
=
'vava'
    
__vale
=
'vale'
 
    
def
__init__(
self
):
        
pass
 
    
def
start(
self
):
        
print
(foo.__vale)
 
obj
=
foo()
print
(obj._foo__vale)

  9Python面向对象中特殊方法:

      __init__      构造方法;封装普通字段

      __del__       析构方法;解释器销毁对象的时候,自动调用__del__

      __call__      如下图:    

    

      __getitem__

      __setitem__

      __delitem__

    

    上图中:

         ret[1:3] ---> 同样执行__getiteam__方法(类型为:slice

         ret[1:3] = [11,22,33] ---> 执行__setitem方法(类型为:slice)

      __dict__      查看对象中所有的字段(查看类中所有的成员)

      __iter__

1
2
3
4
5
6
7
8
class
foo:
    
def
__iter__(
self
):
        
yield
1
obj
=
foo()
for
i
in
obj:      
# 如果执行for对象时,自动会执行对象的iter方法(生成器)
print
(i)
C:\Python35\python.exe H:
/
PyCharm
/
Python
/
PY_learn
/
lx3.py
1

二、Python 异常   

    简单例子:(python2.7

1
2
3
4
5
6
try
:
    
name
=
'shaw'
    
name_list
=
[
'shaw'
,
'sam'
,
'alex'
]
    
print
name_list[
4
]
except
IndexError,ERROR:
    
print
ERROR     
# 程序没有崩溃,还可以继续做其他事情

   常见python 异常:

    AttributeError    试图访问一个对象没有的树形,比如foo.x,但是foo没有属性x

    IOError             输入/输出异常;基本上是无法打开文件

    ImportError         无法引入模块或包;基本上是路径问题或名称错误

    IndentationError    语法错误(的子类) ;代码没有正确对齐(抓不住)

    IndexError      下标索引超出序列边界,比如当x只有三个元素,却试图访问x[5]

    KeyError             试图访问字典里不存在的键

    KeyboardInterrupt   Ctrl+C被按下

    NameError            使用一个还未被赋予对象的变量

    SyntaxError      Python代码非法,代码不能编译(个人认为这是语法错误,写错了)抓不住

    TypeError            传入对象类型与要求的不符合

    UnboundLocalError   试图访问一个还未被设置的局部变量,基本上是由于另有一个同名的全局变量,导致你以为正在访问它

    ValueError          传入一个调用者不期望的值,即使值的类型是正确的

  完整异常结构:

1
2
3
4
5
6
7
8
9
10
11
12
try
:
    
# 主代码块
    
pass
except
keyError as e:
    
# 出现异常时,执行该块
    
pass
else
:
    
# 主代码块执行完毕,执行该块
    
pass
finally
:
    
# 无论异常与否,最终执行该块
    
pass

  自定义异常:

1
2
3
4
5
6
7
8
try
:
    
print
(
123
)
    
raise
Exception(
'出错了...'
)  
# 主动抛出自定义异常
except
Exception as e:
print
(e)
C:\Python35\python.exe H:
/
PyCharm
/
Python
/
PY_learn
/
lx3.py
123
出错了..

  

 

转载于:https://www.cnblogs.com/opsedu/p/7cb745e1b9ba5d00b25fa48e7e0e15cb.html

你可能感兴趣的文章
Django跨域解决方法
查看>>
冒泡排序
查看>>
Mysql字段合并
查看>>
五笔反查工具
查看>>
python 类的继承
查看>>
python 爬取<a>标签内href的方法及遇到的问题
查看>>
.Net 环境下比较各种数据库插入操作的性能
查看>>
CSS: rem
查看>>
驰骋工作流引擎-流程数据md5加密
查看>>
javascript基础学习(一)
查看>>
MSSQL排序规则冲突
查看>>
synchronize模块
查看>>
批量修改文件名(Python)
查看>>
枚举排列
查看>>
MapReduce的手机流量统计的案例
查看>>
zabbix_get 命令介绍
查看>>
jQuery属性操作之类样式操作
查看>>
技术人员的发展之路
查看>>
简单易懂,原码,补码,反码
查看>>
maven项目打包额外lib目录
查看>>