python面向对象进阶
property 内置装饰器函数 只在面向对象中使用
from math import piclass Circle:def __init__(self, r):self.r = r@property # 将类似属性却需要操作得到的一些方法伪装成对象属性def perimeter(self):return 2 * pi * self.r@propertydef area(self):return pi * self.r ** 2circle = Circle(5) print(circle.perimeter) # 调用方法和操作属性相同 本质上还是方法 print(circle.area)
property 提供私有属性的查看,修改和删除
class Person:def __init__(self, name):self.__name = name@propertydef name(self):return self.__name@name.setter # 修改 通过赋值来修改def name(self, new_name):self.__name = new_name@name.deleterdef name(self):del self.__namep = Person('zxc') print(p.name) # zxc p.name = 'zxf' print(p.name) # zxf del p.name # 这里的del只是对应@name.deleter,主要看@name.deleter下面的方法执行了什么 # print(p.name) # 报错 显示没有name属性
classmethod和staticmethod
class Person:__key = '人类'def __init__(self, name):self.__name = name@propertydef name(self):return self.__name@classmethod # 将一个方法变成类中的方法,使这个方法可以直接被类调用而不用依托对象def change_key(cls, new_key):cls.__key = new_keyprint(Person._Person__key) # 人类 Person.change_key('human') print(Person._Person__key) # human # 当这个方法的操作只涉及静态属性的时候 就应该使用classmethod来装饰这个方法
classmethod
class Login:def __init__(self,name,password):self.name = nameself.pwd = passworddef login(self):pass@staticmethod # 装饰一个完全跟类和对象没有关系的静态方法,通过类调用def get_usr_pwd(): # 静态方法usr = input('用户名 :')pwd = input('密码 :')Login(usr, pwd) # 一般用在完全面向对象编程的时候
staticmethod
isinstance和issubclass
class Person:passclass Student(Person):passp = Person() print(isinstance(p, Person)) # True 判断p是不是Person的实例化对象 print(issubclass(Student, Person)) # True 判断Student是不是Person的子类 print(issubclass(Person, Student)) # False
__str__和__repr__
print('zxc') # 打印对象时,就是调用对象的__str__方法 print(str('zxc')) # str(obj) 本质就是 obj.__str__ print('zxc'.__repr__()) # 'zxc' 将对象原封不动的打印出来 print(repr('zxc')) # repr(obj) 本质就是 obj.__repr__ # 格式化输出中的%s和%r就是使用的__str__和__repr__
自己来个类测试一下
class Person:def __str__(self):return 'str zxc'passzxc = Person() # print(zxc) # not zxc 执行了Person类里面的__str__的方法 # 如果注释掉Person类里面的__str__的方法,找不到就到父类里面找,而在新式类中默认继承object,而object中带有__str__方法 print(zxc) # 打印了对象的内存地址
测试中发现个有趣的事情,__repr__是__str__备胎。
class Person:def __str__(self):return 'str zxc'def __repr__(self):return 'repr zxc'zxc = Person() print(zxc) # str zxc# 注释掉__str__方法 print(zxc) # repr zxc 说明__repr__方法是__str__的备用方法,当类中找不到__str__就找__repr__,都没有 再去找父类# 重新放开__str__方法,注释掉__repr__方法 print(repr(zxc)) # 打印了对象的内存地址 说明当类里找不到__repr__方法,就直接去父类里找,不能备用__str__
__del__ 构造析构函数
class File:def __del__(self):print('执行了!')file = File() del file # 执行了! 再执行__del__函数后,进而删除了对象 print(f) # 报错 显示找不到对象f
可能用到的环境:
class File:def __del__(self):self.f.close()print('执行了关闭文件工作!')file = File() file.f = open('file', 'w') del file # 执行了关闭文件工作! # 可以在删除一个对象之前进行一些收尾的工作
__call__ 将一个类变为可调用的,当调用时执行__call__函数
class Person:def __init__(self, name):self.name = namedef __call__(self, *args, **kwargs):print('对象的名字是%s' %self.name)person = Person('zxc') person() # 对象的名字是zxc# 也可以直接调用类 Person('zzy')() # 对象的名字是zzy
转载于:https://www.cnblogs.com/zxc-Weblog/p/8326146.html
python面向对象进阶相关推荐
- Python面向对象进阶和socket网络编程
写在前面 为什么坚持?想一想当初: 一.面向对象进阶 - 1.反射补充 - 通过字符串去操作一个对象的属性,称之为反射: - 示例1: class Chinese:def __init__(self, ...
- Python面向对象进阶与异常、模块以及包管理
这一篇是面向对象的进阶部分,主要还是面向对象的封装,继承,多态方面的讲解,后面的部分是讲解python异常和模块以及包的部分. 目录 一.Python中的继承 1.什么是继承 2.继承的基本语法 3. ...
- Python面向对象进阶及类成员
再次了解多继承 先来一段代码 #!/usr/bin/env python # _*_ coding:utf-8 _*_ class A: def bar(self): print( ...
- Python 面向对象进阶
阅读目录 构造方法.析构方法.__str__ 方法 构造方法 析构方法 __str__ 方法 类的成员 字段(变量) 类变量和实例变量(静态字段 和 字段) 公有/私有 类变量(静态字段) 公有/私有 ...
- 【Python面向对象进阶④】——定制类
Python中的魔法方法 @ author: Flyme awei 方法名 说明 __str__ 用于返回对象的描述 __iter__ 使类可以迭代 __getitem__ 按照下标获取类元素,例如l ...
- 定制类【Python面向对象进阶四】
Python中的魔法方法 @ author: Flyme awei 方法名 说明 __str__ 用于返回对象的描述 __iter__ 使类可以迭代 __getitem__ 按照下标获取类元素,例如l ...
- python——面向对象进阶之新增属性和方法
例如:定义一个类 1.可不可以动态的给对象p赋予一个新的对象属性 1.1 修改实例属性 p.name = 'jam' print(p.name) 1.2 给对象赋予一个新的属性(实例属性) p.sex ...
- 【Python】Python面向对象详解
Python面向对象 Python是一种面向对象的编程语言,因此它支持面向对象编程(OOP).面向对象编程是一种程序设计方法,它将数据和行为打包成对象.对象是类的实例,而类是具有相似属性和行为的一组对 ...
- Python之面向对象进阶
Python之面向对象进阶 进阶有:Python 类的成员.成员修饰符.类的特殊成员. 一.类的成员 类的成员可以分为三大类:字段.方法和属性. 注:所有成员中,只有普通字段的内容保存对象中,即:根据 ...
最新文章
- Udacity机器人软件工程师课程笔记(十四)-运动学-正向运动学和反向运动学(其一)
- 复习计算机网络基础 day3---什么是计算机网络:
- Coolite 中GridView点击行中的按钮时跳转至不同的页面
- linux tty core code,linux tty core 源码分析(5)
- Centos7下 Redis的安装、配置开机自启动、开放远程连接
- c语言中freopen函数,fopen和freopen_C中freopen和fopen的区别(用法+详解+区别)
- Oracle查看表空间和表空间中的对象
- ASP.NET Core MVC TagHelper实践HighchartsNET快速图表控件
- 1024 程序员节专题论坛来袭,聚焦企业级开源数据库 openGauss
- android adb 静默安装,Android_如何静默安装
- 【Linux】awk指令
- Eclipse 中 Could not find *.apk的解决方案
- python批处理代码_Python文件夹批处理操作代码实例
- 人员管理系统 java_员工管理系统java版
- ARKit玩起来 - AR预览唱片-史小川-专题视频课程
- UEFI HOB 学习
- c语言课程设计成型代码,【图片】发几个C语言课程设计源代码(恭喜自己当上技术小吧主)【东华理工大学吧】_百度贴吧...
- 用verilog实现检测1的个数_[转]常用数字处理算法的Verilog实现
- 十五天掌握OpenCV——图像上的算术运算
- 宝塔平台配置JeecgBoot