python 面向对象 【进阶】
多态
多态跟python没有太大关系,因为python本身原生支持多态。
class A:
pass
class B(A):
pass
class C(A):
pass def func(A arg): #可以是B类,也可以是C类
print(arg)
obj=B()
obj1=C()
这个例子说明的是,如果A是int类型的,传参可以传int类型和int的派生类型。
直白的说,就是传参可以传所有的A类型,或者所有的A的子类类型,利用类的继承关系。
ps:python原生支持多态的缺点就是看源码不是特别方便,因为你不知道传的是什么类型的参数。
面向对象之类的成员
类的成员可以分为三部分:字段、方法和属性。

ps:所有成员中,只有普通字段的内容保存对象中,即:根据此类创建了多少对象,在内存中就是有多少个普通字段。而其他的成员,则都是保存在类中,即:无论对象的多少,在内存中只创建一份。
字段
字段包括:普通字段和静态字段,他们在定义和使用中有所区别,而最本质的区别是内存中保存的位置不同。
- 普通字段属于对象
- 静态字段属于类
class Province:
# 静态字段
country = '中国'
def __init__(self, name):
# 普通字段
self.name = name
# 直接访问普通字段
obj = Province('河北省')
print obj.name
# 直接访问静态字段
Province.country
一般情况:自己访问自己字段
规则:普通字段只能用对象访问
静态字段只能用类访问(万不得已的时候可以使用对象访问)
特殊情况:静态字段也可以用对象访问
由上述代码可以看出【普通字段需要通过对象来访问】【静态字段通过类访问】,在使用上可以看出普通字段和静态字段的归属是不同的。其在内容的存储方式类似如下图:

由上图可是:
- 静态字段在内存中只保存一份
- 普通字段在每个对象中都要保存一份
应用场景: 通过类创建对象时,如果每个对象都具有相同的字段,那么就使用静态字段
ps:静态字段在代码加载时,已经创建
方法
方法包括:普通方法、静态方法和类方法,三种方法在内存中都归属于类,区别在于调用方式不同。
- 普通方法:由对象调用;至少一个self参数;执行普通方法时,自动将调用该方法的对象赋值给self;
- 类方法:由类调用; 至少一个cls参数;执行类方法时,自动将调用该方法的类复制给cls;
- 静态方法:由类调用;无默认参数;
class Foo:
def __init__(self,name):
self.name = name
self.country = "China"
def show(self):
'''普通方法,至少一个self参数'''
print(self.name)
@staticmethod
def f1(arg):
'''静态方法,任意参数'''
print(arg)
@classmethod
def f2(cls): #class的缩写
'''类方法,至少一个cls参数'''
print(cls)
obj = Foo('pando')
obj.show() #调用普通方法
Foo.f1(222) #调用静态方法
Foo.f2() #调用类方法
执行结果:
pando
222
<class '__main__.Foo'>
方法
所有方法都属于类
1.普通方法:至少一个self参数,对象执行
2.静态方法:任意参数,类执行(万不得已可以用对象执行)
3.类方法:至少一个cls参数,类执行(万不得已可以用对象执行)
类方法:其实是静态方法的一种特殊形式,唯一的特殊功能就是 自动把类名当作参数传递。
属性
属性:具有方法的表现形式,具有字段的访问形式,python中的属性其实是普通方法的变种。
属性的基本使用方法
class Mo:
def func(self):
pass
# 定义属性
@property
def prop(self):
pass
mo_obj = Mo()
mo_obj.func() #调用方法
mo_obj.prop #调用属性
属性的定义和调用要注意以下几点:
定义时,在普通方法的基础上添加 @property 装饰器;
定义时,属性仅有一个self参数
调用时,无需括号
方法:foo_obj.func()
属性:foo_obj.prop
获取、修改、删除属性
class Goods(object):
@property
def price(self):
print ('@property')
@price.setter
def price(self, value):
print ('@price.setter,',value)
@price.deleter
def price(self):
print ('@price.deleter')
# ############### 调用 ###############
obj = Goods()
obj.price # 自动执行 @property 修饰的 price 方法,并获取方法的返回值
obj.price = 123 # 自动执行 @price.setter 修饰的 price 方法,并将 123 赋值给方法的参数
del obj.price # 自动执行 @price.deleter 修饰的 price 方法
执行结果:
@property
@price.setter, 123
@price.deleter
属性的三种访问方式,并分别对应了三个被@property、@方法名.setter、@方法名.deleter修饰的方法
另一种常用表现形式
class Goods(object):
def get_price(self):
print ('@property')
def set_price(self, value):
print ('@price.setter,',value)
def del_price(self):
print ('@price.deleter')
foo =property(fget=get_price,fset=set_price,fdel=del_price)
# ############### 调用 ###############
obj = Goods()
obj.foo # 自动执行 @property 修饰的 price 方法,并获取方法的返回值
obj.foo = 123 # 自动执行 @price.setter 修饰的 price 方法,并将 123 赋值给方法的参数
del obj.foo # 自动执行 @price.deleter 修饰的 price 方法
执行结果:
@property
@price.setter, 123
@price.deleter
【面向对象之成员修饰符】
python 面向对象 【进阶】的更多相关文章
- Python面向对象进阶(二)
Python面向对象进阶2.html :first-child{margin-top:0!important}img.plugin{box-shadow:0 1px 3px rgba(0,0,0,.1 ...
- Python开发【第七篇】:面向对象 和 python面向对象进阶篇(下)
Python开发[第七篇]:面向对象 详见:<Python之路[第五篇]:面向对象及相关> python 面向对象(进阶篇) 上一篇<Python 面向对象(初级篇)> ...
- Python面向对象进阶和socket网络编程-day08
写在前面 上课第八天,打卡: 为什么坚持?想一想当初: 一.面向对象进阶 - 1.反射补充 - 通过字符串去操作一个对象的属性,称之为反射: - 示例1: class Chinese: def __i ...
- Python面向对象进阶和socket网络编程
写在前面 为什么坚持?想一想当初: 一.面向对象进阶 - 1.反射补充 - 通过字符串去操作一个对象的属性,称之为反射: - 示例1: class Chinese: def __init__(self ...
- python面向对象进阶(八)
上一篇<Python 面向对象初级(七)>文章介绍了面向对象基本知识: 面向对象是一种编程方式,此编程方式的实现是基于对 类 和 对象 的使用 类 是一个模板,模板中包装了多个“函数”供使 ...
- python面向对象进阶
前言 上节大话python面向对象对面向对象有了一些了解,这次就不用大话风格了 (ps:真心不好扯啊) isinstance与issubclass isinstance(obj,cls)检查是否obj ...
- python 面向对象进阶之内置方法
一 isinstance(obj,cls)和issubclass(sub,super) 1.1,isinstance(obj,cls)检查是否obj是否是类 cls 的对象 class Foo(obj ...
- Python 面向对象 (进阶篇)
<Python 面向对象(初级篇)>文章介绍了面向对象基本知识: 面向对象是一种编程方式,此编程方式的实现是基于对 类 和 对象 的使用 类 是一个模板,模板中包装了多个“函数”供使用(可 ...
- Python之路-python(面向对象进阶)
一.面向对象高级语法部分 1.静态方法.类方法.属性方法 2.类的特殊方法 3.反射 二.异常处理 三.Socket开发基础 一.面向对象高级语法部分 静态方法(@staticmethod) 定义:只 ...
- Python学习笔记【第十篇】:Python面向对象进阶
保护对象的属性 如果有一个对象,当需要对其进行修改属性时,有2种方法 对象名.属性名 = 数据 ---->直接修改 对象名.方法名() ---->间接修改 为了更好的保存属性安全,即不能随 ...
随机推荐
- centos7 装机配置及 mysql 安装过程
打开网卡,使操作系统可以上网 1 ip add 查看网卡,lo是回环网卡可以忽略,ens33为实际网卡. [root@localhost ~]# ip add 1: lo: <LOOPBACK, ...
- iview modal对话框的一个小知识点
我在做一个项目的一个页面的时候有两个弹窗,发现点击一个弹窗的右上角关闭按钮后,打开另一个弹窗的时候,另一个弹窗里面带有上一个弹窗里的样式内容,说明上一个弹窗并没有被销毁. 后来发现modal源码里的c ...
- 详解exif.js,应用于canvas照片倒转(海报H5)
业务背景,苹果手机调用上传接口拍照没有问题但是上传到网页上照片倒转了解决方法利用exif.js读取图片参数并对图片进行元数据修改 window.btoa(str)转码 window.atob(base ...
- apache2 + django 路径问题
问题: 在代码中使用sys.path.append(), 添加模块路径后,仍然报错找不到包. 虽然在LD_LIBRARY_PATH中配置了.so文件打路径,仍然报错找不到. 原因: 检查apahce2 ...
- 点击劫持(click jacking)
什么是点击劫持劫持原理劫持案例代码示例优酷频道刷粉的POC腾讯微博刷粉防御 什么是点击劫持 点击劫持,clickjacking,也被称为UI-覆盖攻击.这个词首次出现在2008年,是由互联网安全专家罗 ...
- mysql Access denied for user root@localhost错误解决方法总结
原文:http://www.111cn.net/database/mysql/44142.htm Access denied for user 'root'@'localhost' (using pa ...
- Linux下用tree命令列出树形图
命令用法: tree 参数: -a 显示所有文件和目录. -A 使用ASNI绘图字符显示树状图而非以ASCII字符组合. -C 在文件和目录清单加上色彩,便于区分各种类型. -d 显示目录名称而非内容 ...
- Delphi导出word
//导出Wordprocedure TFrm_Computing.ExportWord;varwordApp, WordDoc, WrdSelection, wrdtable, wrdtable1, ...
- c# 短链接生成
public static string GetShortUrl(string url) { //可以自定义生成MD5加密字符传前的混合KEY string key = DateTime.Now.To ...
- sencha touch overlay 里使用 list
1 sencha touch 中 list 如果不设置一个固定高度或 flex : 1, list 的内容就不会显示出来. 主要是因为 list 是可滚动的,你不设置高度 ,list 的高度默认就是 ...