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中的标准类型就是多 ...
随机推荐
- 【最新发布】最新Python学习路线,值得收藏
随着AI的发展,Python的薪资也在逐年增加,但是很多初学者会盲目乱学,连正确的学习路线都不清楚,踩很多坑,为此经过我多年开发经验以及对目前行业发展形式总结出一套最新python学习路线,帮助大家正 ...
- vue项目iframe的传值问题
前言 项目需要,我需要引入一个已经封装好的浏览器插件.插件只能以html的方式调用, 所以.我把插件的使用封装了一个html页面.vue项目则利用iframe的方式引入. 到这里我就遇到了一个问题,那 ...
- 看源码学编程系列之kafka(一)
kafka 由于它自身的高性能发送与消费能力,而受到广大企业的喜欢,所以我们就先看看kafka 一些源码实现如下: public void run() { int messageNo = 1; whi ...
- JPA中使用@Query注解多表联查
原生SQL: select `user`.id, `user`.`name`,dept.name deptName,sum(sd.score) SumScore from `user` LEFT JO ...
- SpringBoot 源码解析 (九)----- Spring Boot的核心能力 - 整合Mybatis
本篇我们在SpringBoot中整合Mybatis这个orm框架,毕竟分析一下其自动配置的源码,我们先来回顾一下以前Spring中是如何整合Mybatis的,大家可以看看我这篇文章Mybaits 源码 ...
- TypeScript SDK 和 REST API
在本文中,我们将讨论CUBA平台中已经存在很长时间的一个功能,但是很多人还不知道,这就是前端SDK生成器,并了解它如何与CUBA的REST API插件一起使用. Java+JavaScript - 在 ...
- MYSQLnavicat绿色版工具下载
MYSql远程连接工具navicat工具:https://pan.baidu.com/s/1RU_8FCX7yCseAFRhn4voAQ
- Java从零到企业级电商项目实战(第1章 课程介绍)
- Ansible Playbooks 介绍 和 使用 二
目录 handlers playbook 案例 2 handlers vars 变量 setup facts 变量使用 案例 inventory 中定义变量 案例 条件测试 when 语句 案例 迭代 ...
- 英语口语考试资料Family
I Love my family 12 years ago, I was born in a happy family, there was a gentle father, a beautif ...