面向对象相关知识及常用操作(二)
本篇将详细介绍Python 类的成员、成员修饰符、类的特殊成员。
类的成员分为字段、方法和属性
字段:分为普通字段和静态字段,普通字段在每个对象的内存中均保存一份,静态字段仅在类的内存中保存一份
方法:分为普通方法、类方法和静态方法,
- 普通方法:由对象调用;至少一个self参数;执行普通方法时,自动将调用该方法的对象赋值给self;
- 类方法:由类调用; 至少一个cls参数;执行类方法时,自动将调用该方法的类复制给cls;
- 静态方法:由类调用;无默认参数;
字段和方法常见使用见下面例子:
1 #类的成员分为字段、方法和属性 2 #字段,分为普通字段和静态字段,普通字段属于对象,静态字段属于类 3 #方法:分为普通方法、静态方法和类方法 4 #普通方法:由对象调用,至少有一个self参数,执行普通方法时,自动将该方法调用的对象赋值给self 5 #类方法:由类调用,至少又一个cls参数,执行类方法时,自动将调用该方法的类复制给cls 6 #静态方法:由类调用,无默认参数 7 class FOO: 8 func="我是静态字段" 9 def __init__(self,name): 10 self.name=name #普通字段 11 12 def ord_fun(self): 13 print("普通方法,至少有一个self字段",self.name) 14 @classmethod 15 def class_fun(cls): 16 print("类方法,至少有一个cls参数") 17 @staticmethod 18 def static_fun(): 19 print("静态方法,无参数") 20 21 @property 22 def prop(self): 23 print("属性调用") 24 25 #普通字段的调用: 26 f=FOO("Eric") 27 print(f.name) 28 #静态字段的调用 29 print(FOO.func) 30 31 #普通方法的调用 32 f.ord_fun() 33 #类方法的调用 34 FOO.class_fun() 35 #静态方法的调用 36 FOO.static_fun() 37 #属性调用,与普通方法的调用一致,定义时仅有一个self参数,调用时无需括号 38 #访问属性时可以制造出和访问字段完全一致的假象 39 #属性由方法变种而来,若没有属性,方法完全可以替代 40 f.prop
属性
1、属性的基本使用
- 定义时,在普通方法的基础上添加 @property 装饰器;
- 定义时,属性仅有一个self参数
- 调用时,无需括号
- 方法:foo_obj.func()
- 属性:foo_obj.prop
- python属性的功能:属性内部进行一系列的逻辑运算,最终将计算结果返回
1 class Pager(object): 2 def __init__(self,current_page): 3 #用户当前请求的页码 4 self.current_page=current_page 5 #每页默认显示的条数 6 self.per_items=10 7 8 @property 9 def start(self): 10 val=(self.current_page-1)*self.per_items+1 11 return val 12 @property 13 def end(self): 14 val=self.current_page*self.per_items 15 return val 16 # 17 p=Pager(2) 18 print("第二页开始:",p.start) 19 print("第二页结束:",p.end)
2、属性的两种定义方法:
1、装饰器,即在方法上使用装饰器
2、静态字段,即在类中定义值为property的字段
装饰器:经典类:如上述例子所示,定义属性的方法 @property
新式类:新式类的属性比经典类的属性丰富
1 #新式类,具有三种@property装饰器 2 class Goods(object): 3 def __init__(self,name): 4 self.name=name 5 #原价 6 self.original_price=100 7 #折扣价 8 self.discount=0.8 9 10 @property 11 def price(self): 12 #实际价格 13 new_price=self.original_price*self.discount 14 return new_price 15 16 @price.setter 17 def price(self,value): 18 #修改商品原价 19 self.original_price=value 20 21 @price.deleter 22 def price(self): 23 #删除商品原价 24 del self.original_price 25 26 obj=Goods("apple") 27 print(obj.price) 28 obj.price=200 29 print(obj.price) 30 del obj.price
静态字段方式:使用静态字段创建属性时,经典类和新式类无区别
静态字段方式创建属性具有三种访问方式,我们可以根据他们几个属性的访问特点,分别将三个方法定义为对同一个属性:获取、修改、删除
1 class Goods(object): 2 3 def __init__(self): 4 # 原价 5 self.original_price = 100 6 # 折扣 7 self.discount = 0.8 8 9 def get_price(self): 10 # 实际价格 = 原价 * 折扣 11 new_price = self.original_price * self.discount 12 return new_price 13 14 def set_price(self, value): 15 self.original_price = value 16 17 def del_price(self, value): 18 del self.original_price 19 20 PRICE = property(get_price, set_price, del_price, '价格属性描述...') 21 22 obj = Goods() 23 obj.PRICE # 获取商品价格 24 obj.PRICE = 200 # 修改商品原价 25 del obj.PRICE # 删除商品原价
二、类成员的修饰符
类成员分为:公有成员:在任何地方都能方位
私有成员:只有在类的内部才能访问,私有成员命名时前两个字符是下划线 __name,特殊成员除外(__init__)
1 #公有成员:在任何地方都能访问。静态:类的对象可以访问,类内部可以访问,派生类可以访问 2 #私有成员:只有在类的内部才能访问,仅在类内部可以访问 3 class C(object): 4 name="公有静态字段" 5 __na="私有静态字段" 6 def __init__(self): 7 self.foo="公有普通字段" 8 self.__fox="私有普通字段" 9 10 def func(self): #类内部访问 11 print(self.foo) 12 print(self.__fox) 13 print(C.name) 14 print(C.__na) 15 class D(C): #只能访问公有静态字段和公有普通字段 16 def show(self): 17 print(C.name) 18 # print(C.__na) 无法正常访问 19 print(self.foo) 20 # print(self.__fox) 无法正常访问私有字段 21 print("类访问:",C.name) #类访问 22 # print("类访问私有字段:",C.__na) #报错,无法访问 23 obj2=C() 24 obj2.func() #全部可以正常访问,打印四个 25 26 27 obj_d=D() 28 obj_d.show()
类的特殊成员在实际使用中知道即可,故不一一列举
转载于:https://www.cnblogs.com/eric8899/p/6048400.html
面向对象相关知识及常用操作(二)相关推荐
- Python os和os.path的基础知识与常用操作
目录 1 os与os.path的关系 2 os和os.path的常用属性和方法 2.1 os模块常用属性 2.2 os模块常用方法 2.3 os.path模块常用方法 2.3.1 路径的常用操作 2. ...
- idea项目相关错误与常用操作教程
目录 一.创建项目 1.主启动类main函数里面的String无法加载,因为没有导入JDK 2.破坏.idea缓存等导致的启动失败 3.创建web项目的包名应该是小写 二.SSMP实例 1.查询结果为 ...
- 二叉搜索树相关知识及应用操作
文章目录 概念 查找二叉搜索树的第k大节点 概念 二叉查找树(Binary Search Tree),(又名:二叉搜索树,二叉排序树)--它或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不 ...
- 4.Java面向对象相关知识总结
一.static关键字 1. static修饰的特点 1.1 被类的所有对象共享,是我们判断是否使用静态关键字的条件. 1.2 随着类的加载而加载,优先于对象存在(即使没有创建对象,也可以通过类名来使 ...
- python 列表常用操作(二)
1.tuple 的 unpack a,b = t 2.格式化输出 print('您的输入:{},值为{}',format(a,b)) 3.日期计算 import datetime as dt impo ...
- php面向对象封装mysql_php mysqli面向对象封装mysql数据库常用操作
首先封装好mysql类 mysql.php class Mysql{ private static $host="localhost"; private static $user= ...
- string类的相关知识及部分操作
文章目录 string对象的初始化 string::size_type类型 string对象的读写操作 使用标准库中的iostream 使用getline读取一整行 string对象的比较操作 str ...
- Java 数组常用操作二(扩充、扩容、重复数据、动态数组、数组差集、数组交集、查找指定元素、判断是否相同、数组合并)
数组扩容(扩充) public class Main {public static void main(String[] args) {String[] names = new String[] { ...
- Java之集合(最全集合相关知识)
集合 集合 一.集合概述 1.为什么要学习集合? 2.定义 3.说明 4.注意 5.集合分类 5.1 单列集合Collection 5.2 双列集合Map 二.Collection接口 1.相关方法 ...
- python序列类型-什么是序列,Python序列详解(包括序列类型和常用操作)
所谓序列,指的是一块可存放多个值的连续内存空间,这些值按一定顺序排列,可通过每个值所在位置的编号(称为索引)访问它们. 为了更形象的认识序列,可以将它看做是一家旅店,那么店中的每个房间就如同序列存储数 ...
最新文章
- 中式古建筑su模型大全
- chatscript_如何使用ChatScript构建您的第一个聊天机器人
- Swift String字符串版本更新特性
- SpringMVC _Controller认识(1)
- Linux中断线程化的优势,记一个实时Linux的中断线程化问题
- aspx调试的时候其他机器也可以打开_VSCode 穿越跳板机调试远程代码
- 阿里云ubuntu16.04安装ruby
- mysql的关系表_MySQL表关系总结
- Stimulsoft Dashboards.WEB 2022.2.3 Crack
- Python之shp文件
- 搜狗微信文章url解码
- 浅聊使用PHP实现微信公众号登录
- 【数据应用案例】用户画像与实践案例
- Labview2018学习之三:LabVIEW编程
- 黄山5日游 最省钱的线路指南
- wamp下载和使用PHPDocumentor
- 修改openwrt或者LEDE默认wifi名称以及默认开启wifi
- 虚拟摄像头之三: 重构android8.1 的 v4l2_camera_HAL 支持虚拟摄像头
- 王半仙儿的日记-0002
- 非负函数无穷积分的收敛判别法
热门文章
- python将txt文档中的内容按字母顺序进行排序,并存入txt中
- Java json字符串转Object
- vue-cli@webpack@4打包分析命令
- 程序员到项目经理:从内而外的提升(比较全面的介绍)
- 创建高质量Python工程(1)-如何设计结构清晰的目录结构(转)
- 使用sp_addlinkedserver、sp_dropserver 、sp_addlinkedsrvlogin和sp_droplinkedsrvlogin 远程查询数据...
- AngularJS学习之旅—AngularJS 事件(十四)
- 索引大小对语句执行速度的影响
- DoraHacks的笔记
- Bzoj 3831: [Poi2014]Little Bird