Python3 面向对象进阶2
Classmethod
- classmethod是一个装饰器, 用来装饰类内部的方法, 使得该方法绑定给类来使用
- 对象绑定方法的特殊之处: 由对象调用, 将对象作为第一参数传给该方法
- 类的绑定方法的特殊之处: 由类来调用, 将类作为第一参数传给该方法
Staticmethod
- staticmethod是一个装饰器, 用来装饰类内部的方法, 使得该方法既不绑定给对象, 也不绑定给类
# settings.py
USER = 'bigb'
PASSWORD = '123'
import uuid
import settings
import hashlib
class User:
def __init__(self, username, password):
self.username = username
self.password = password
def admin(self):
if not self.username == 'bigb' and self.password == '123':
print('请用管理员账户登录...')
return
print('显示管理员功能...')
@classmethod
def __from_settings(cls):
obj = cls(settings.USER, settings.PASSWORD)
return obj
@staticmethod
def creat_id():
uuid_obj = uuid.uuid4()
md5 = hashlib.md5()
md5.update(str(uuid_obj).encode('utf-8'))
return md5.hexdigest()
obj1 = User._User__from_settings()
obj1.admin() # 显示管理员功能...
obj2 = User('blake', '123')
obj2.admin() # 请用管理员账户登录...
print(obj2.creat_id()) # e249b25cdd1963a4949cc99d3ad46ff2
Isinstance
isinstance(args1, args2)Python内置函数, 用于判断args1(对象)是否是args2(类)的一个实例
class Foo:
pass
foo_obj = Foo()
print(isinstance(foo_obj, Foo)) # True
Issubclass
issubclass(args1, args2)Python内置函数, 用于判断args1是否是args2的子类
class ParentClass:
pass
class ChildClass(ParentClass):
pass
class OtherClass:
pass
print(issubclass(ChildClass, ParentClass)) # True
print(issubclass(OtherClass, ParentClass)) # False
反射
概念
- 反射指的是通过字符串对对象或类的属性进行操作
hasattr
hasattr(o, attrname)判断o(类或对象) 中是否有名字叫attrname(字符串) 这样的一个属性
class Chinese:
country = 'China'
def __init__(self, name, age, gender):
self.name = name
self.age = age
self.gender = gender
people = Chinese('bigb', '18', 'male')
print('name' in people.__dict__) # True
print(hasattr(people, 'name')) # True
getattr
getattr(o, attrname, default): 用来获取o(对象或类) 中名叫attrname(字符串) 的属性对象, 如果没有则返回默认值default
class Chinese:
country = 'China'
def __init__(self, name, age, gender):
self.name = name
self.age = age
self.gender = gender
def say_slogan(self):
print('One China')
people = Chinese('bigb', '18', 'male')
people.say_slogan() # One China
getattr(people, 'say_slogan')() # One China
print(getattr(people, 'country')) # China
print(getattr(people, 'country1', 'China')) # China
class Movie:
def input_cmd(self):
while True:
cmd = input('请输入方法名: ')
if hasattr(self, cmd):
method = getattr(self, cmd)
method()
def upload(self):
print('电影开始上传...')
def download(self):
print('电影开始下载...')
movie_obj = Movie()
movie_obj.input_cmd()
setattr
setattr(o, attrname, value)用来添加或修改o(对象或类) 的属性:attrname = value
class Chinese:
country = 'China'
def __init__(self, name, age, gender):
self.name = name
self.age = age
self.gender = gender
def say_slogan(self):
print('One China')
people = Chinese('bigb', '18', 'male')
# 修改
setattr(people, 'gender', 'female')
# 添加
setattr(people, 'province', 'Anhui')
print(people.gender) # female
print(people.province) # Anhui
delattr
delattr(o, attrname)用来删除o(对象或类) 中叫做attrname(字符串) 的属性
class Chinese:
country = 'China'
def __init__(self, name, age, gender):
self.name = name
self.age = age
self.gender = gender
def say_slogan(self):
print('One China')
people = Chinese('bigb', '18', 'male')
# 添加
setattr(people, 'province', 'Anhui')
# 删除
delattr(people, 'province')
print(people.province) # AttributeError: 'Chinese' object has no attribute 'province'
魔法方法
概念
- 在类内部定义, 以
__开头__结尾的方法的方法都称之为魔法方法, 又称为类的内置方法 - 魔法方法会在某些条件成立是触发
- 魔法方法都是object类内定义的方法
__new__
- 在调用类时自动触发 (return
self给__init__)
class Foo(object):
def __new__(cls, *args, **kwargs):
print('__new__')
return object.__new__(cls) # 产生了一个空对象
def __init__(self):
print('__init__')
foo_obj = Foo()
'''
__new__
__init__
'''
__init__
- 在创建完对象后自动触发
__init__是实例化对象后触发的第一个方法(接收__new__return 的self)
__str__
- 在打印对象时自动触发
- 必须要有一个返回值, 该返回值必须是字符串类型
class Foo(object):
def __str__(self):
print('__str__在打印对象时自动触发')
return '__str__的返回值'
foo_obj = Foo()
print(foo_obj)
'''
__str__在打印对象时自动触发
__str__的返回值
'''
__call__
- 在对象被调用时自动触发
class Foo(object):
def __call__(self, *args, **kwargs):
print('__call__在对象被调用时自动触发')
foo_obj() # __call__在对象被调用时自动触发
__getattr__
- 在
对象.属性时, 没有该属性时候自动触发
class Foo(object):
# 默认返回None
def __getattr__(self, item):
print('__getattr__会在对象.属性,且属性不存在时自动触发')
return item
foo_obj = Foo()
print(foo_obj.x)
'''
__getattr__会在对象.属性,且属性不存在时自动触发
x
'''
__setattr__
- 在
对象.属性=属性值时自动触发
class Foo(object):
def __setattr__(self, key, value):
print('__setattr__在 对象.属性=属性值 时自动触发')
print(key, value)
foo_obj = Foo()
# 类中有__setattr__ 方法时, 如下操作只触发了__setattr__方法, 并不会给对象添加或修改属性
foo_obj.x = 1
'''
__setattr__在 对象.属性=属性值 时自动触发
x 1
'''
print(foo_obj.x) # AttributeError: 'Foo' object has no attribute 'x'
__del__
- 在对象被销毁后自动触发
class Foo(object):
def __del__(self):
print('__del__在对象被销毁后自动触发')
foo_obj = Foo()
print('对象被销毁前')
del foo_obj
print('程序最后的代码.')
'''
对象被销毁前
__del__在对象被销毁后自动触发
程序最后的代码
'''
class Myfile(object):
def __init__(self, file_name, mode='r', encoding='utf-8'):
self.file_name = file_name
self.mode = mode
self.encoding = encoding
def file_open(self):
self.f = open(self.file_name, self.mode, encoding=self.encoding)
def file_read(self):
data = self.f.read()
print(f'''
当前文件: {self.file_name}
当前文件数据: {data}
''')
def __del__(self):
self.f.close()
print('关闭文件成功!')
f = Myfile('test_file.txt')
f.file_open()
f.file_read()
'''
当前文件: test_file.txt
当前文件数据: This is the content of test_file.txt
关闭文件成功!
'''
单例模式
概念
- 单例模式指的是某个类在整个系统中只存在一个实例的一种设计模式
目的
- 减少内存占用
- 加快运行性能 (只初始化一次)
实现方式
class File(object):
__instance = None
# # 方式1, 通过类的绑定方法实现
# @classmethod
# def singleton(cls, file_name):
# # 当类没有实例时
# if not cls.__instance:
# # 创建实例
# cls.__instance = cls(file_name)
# return cls.__instance
# 方式2, 通过__new__方法实现
def __new__(cls, *args, **kwargs):
# 当类没有实例时
if not cls.__instance:
# 创建实例
cls.__instance = object.__new__(cls)
return cls.__instance
def __init__(self, file_name, mode='r', encoding='utf-8'):
self.file_name = file_name
self.mode = mode
self.encoding = encoding
def open(self):
self.f = open(self.file_name, self.mode, encoding=self.encoding)
def file_read(self):
data = self.f.read()
print(f'''
当前文件: {self.file_name}
当前文件数据: {data}
''')
def close(self):
self.f.close()
# obj1 = File.singleton('test_file.txt')
# obj2 = File.singleton('test_file.txt')
# obj3 = File.singleton('test_file.txt')
obj1 = File('test_file.txt')
obj2 = File('test_file.txt')
obj3 = File('test_file.txt')
print(obj1)
print(obj2)
print(obj3)
'''
<__main__.File object at 0x0000000009F87A58>
<__main__.File object at 0x0000000009F87A58>
<__main__.File object at 0x0000000009F87A58>
'''
Python3 面向对象进阶2的更多相关文章
- Python3 面向对象进阶1
目录 组合 概念 目的 实现方式 封装 概念 目的 实现方式 访问限制 概念 目的 实现方式 property 概念 目的 实现方式 多态 概念 目的 抽象类 概念 目的 实现方法 鸭子类型 组合 概 ...
- Python全栈开发【面向对象进阶】
Python全栈开发[面向对象进阶] 本节内容: isinstance(obj,cls)和issubclass(sub,super) 反射 __setattr__,__delattr__,__geta ...
- python基础——面向对象进阶下
python基础--面向对象进阶下 1 __setitem__,__getitem,__delitem__ 把对象操作属性模拟成字典的格式 想对比__getattr__(), __setattr__( ...
- Python面向对象进阶和socket网络编程-day08
写在前面 上课第八天,打卡: 为什么坚持?想一想当初: 一.面向对象进阶 - 1.反射补充 - 通过字符串去操作一个对象的属性,称之为反射: - 示例1: class Chinese: def __i ...
- Python中级 —— 01面向对象进阶
面向对象进阶 总结.补充(http://blog.csdn.net/fgf00/article/details/52479307) 面向对象高级语法部分 静态方法.类方法.属性方法 类的特殊方法 反射 ...
- python_面向对象进阶(7)
第1章 面向对象特性—继承(补充) 1.1 接口类.抽象类介绍 1.2 接口类 1.3 接口类应用过程 1.3.1 第一版:完成多种支付方式接口 1.3.2 第二版: 归一化设计,统一支付方式 1.3 ...
- Python面向对象进阶和socket网络编程
写在前面 为什么坚持?想一想当初: 一.面向对象进阶 - 1.反射补充 - 通过字符串去操作一个对象的属性,称之为反射: - 示例1: class Chinese: def __init__(self ...
- day021|python之面向对象进阶1
面向对象进阶 目录 面向对象进阶 1 继承 1.1 继承入门 1.1.1 继承基础 1.1.2 类的基本使用 1.2 多继承 1.2.1 多继承的基本使用 1.2.2 多继承以后的重复性 1.3 类的 ...
- day26、面向对象进阶:多态、封装、反射
一.多态 什么是多态: 类的继承有两层意义:1.改变 2.扩展 多态就是类的这两层意义的一个具体的实现机. 即:调用不同类实例化的对象,下的相同的方法,实现的过程不一样 python中的标准类型就是多 ...
随机推荐
- C#winfrom将XML数据保存读取删除
//创建一个数据集,将其写入xml文件 string name = "1.xml"; System.Data.DataSet ds = new System.Data.DataSe ...
- PHP 富文本解码为 HTML 并显示
PHP 富文本解码为 HTML 并显示 使用 html_entity_decode 函数 参考文档 PHP实例: // html_entity_decode(待解码内容, 如何处理引号) html_ ...
- 神奇的 SQL 之 MySQL 性能分析神器 → EXPLAIN,SQL 起飞的基石!
前言 开心一刻 某人养了一头猪,烦了想放生,可是猪认识回家的路,放生几次它都自己回来了.一日,这个人想了个狠办法,开车带着猪转了好多路进山区放生,放生后又各种打转,然后掏出电话给家里人打了个电话,问道 ...
- 缓冲&缓存&对象池概念的理解
一).缓冲 作用:缓解程序上下层之间的性能差异. 1).当上层组件的性能优于下层组件时加入缓冲机制可以减少上层组件对下 层组件的等待时间. 2).上层组件不需要等待下层组件接收全部数据,即可返回操作, ...
- 2019-9-11:渗透测试,基础学习,VMware安装centos 7
VMware Workstation 15 Pro 安装Centos 7,详细图文步骤 1,点击VMware菜单栏的“文件”-->“新建虚拟机”,选择“典型”使用向导创建虚拟机,点击“下一步” ...
- Xamarin.Forms 学习系列之优秀UI收集
1.各种优秀UI例子 https://github.com/jsuarezruiz/xamarin-forms-goodlooking-UI 输入框例子 https://github.com/enis ...
- 最短路径算法(跟新SPFA,Ford)
//以城市路为蓝本介绍算法 1381:城市路(Dijkstra) 时间限制: 1000 ms 内存限制: 65536 KB提交数: 4517 通过数: 1306 [题目描述] ...
- 【开发工具 - Android Studio】之AndroidStudio使用笔记
一.关闭自动更新: 问题:刚刚安装Android Studio的童鞋可能会遇到这样一个问题:Android Studio在打开的时候一直在下载一些东西,浪费很多时间,而且最终大多都会显示下载失败等等, ...
- java 抽象类和接口整理
java中定义一些不含方法体的方法,方法体的实现交给该类的子类根据自己的具体情况去实现,这样的方法就是abstract修饰的抽象方法,包含抽象方法的类叫抽象类,用abstract修饰 抽象方法: ab ...
- linux虚拟机中FTP本地用户模式配置流程
1.首先在自己虚拟机中安装vsftpd服务,可以先去yum中下载(当然你要有本地yum仓库) 输入命令: yum install vsftpd 下载完成之后打开vsftpd服务 输入命令:syst ...