classmethod与staticmethod

装饰器,均可以装饰类内部的方法

classmethod :使该方法绑定给类来使用,称为类的绑定方法

staticmethod:使该方法变成了一个普通函数,即非绑定方法

再来复习一下对象的绑定方法特殊之处

对象的绑定方法特殊之处:

​ - 由对象调用,会将对象当做第一个参数传入该方法

类的绑定方法特殊之处:

​ - 由类来调用,会将类名当做第一个参数传入该方法

上代码

import settings
import uuid
import hashlib class People:
def __init__(self,name,age):
self.name = name
self.age = age # 将该方法装饰成类的绑定方法
# 登录认证,从配置文件中读取用户名密码
@classmethod
def login_auth(cls):
obj = cls(settings.USER,settings.PWD)
return obj # 将该方法装饰成一个普通的函数,不会自动传值,对象or类都可以调用
@staticmethod
def create_id():
uuid_obj = uuid.uuid4()
return hashlib.md5(str(uuid_obj).encode("utf-8")).hexdigest() def index(self):
print("验证通过,显示主页") # 用classmethod 装饰过的方法返回一个对象
obj = People.login_auth() # 在该方法中通过读取配置文件的参数实例化出一个对象
obj.index() # 将返回出去的对象调用其他方法 # 调用 staticmethod 装饰过的方法,即普通函数,由类调用,也可以对象调用
print(People.create_id())

面向对象高级

isinstance、issubclass

python中内置的函数,均传入两个参数(参数1,参数2)

isinstance:判断一个对象是否是一个类的实例(判断一个对象是否是已知类型)

issubclass:判断一个类是否是另一个类的子类。

class Foo:
pass class Bar(Foo):
pass # isinstance 判断对象是否是类的实例
f = Foo()
print(isinstance(f,Foo)) # True
l = [1,2]
print(isinstance(l,list)) # True # issubclass 判断类是否是另一个类的子类
print(issubclass(Bar,Foo)) # True

反射

反射☞的是通过 “字符串” 对 对象或类的属性进行操作

hasattr:通过字符串,判断该字符串是否是对象或类的属性

getattr:通过字符串,获取对象或类的属性

setattr:通过字符串,设置对象或类的属性

delattr:通过字符串,删除对象或类的属性

上代码

class People:
country = "China"
def __init__(self,name,age,sex):
self.name = name
self.age = age
self.sex = sex # hasattr 传两个参数,判断对象有没有属性
p1 = People("qinyj",18,"nan")
print(hasattr(p1,"country")) # True # getattr 传三个参数,也可以传两个参数,如果属性不存在报错
p2 = People("qinyj",18,"nan")
print(getattr(p2,"country","China")) # setattr 传两个参数,设置对象的属性
p3 = People("qinyj",18,"nan")
setattr(p3,"country","China")
print(getattr(p3,"country",)) # delattr 传两个参数,删除对象的属性
p4 = People("qinyj",18,"nan")
# delattr(p4,"country")
# print(getattr(p4,"country",))
# 反射练习
class Movie:
def input_cmd(self):
print("请输入命令")
while True:
cmd = input("请输入执行的方法名").strip() # hasattr 与 getattr 连用实例
if hasattr(self,cmd):
getattr(self,cmd)() def upload(self):
print("电影开始上传") def download(self):
print("电影开始下载")
m = Movie()
m.input_cmd()

魔法方法(类内置方法)

凡是在类内部定义,"__名字__"的方法都称之为魔法方法,又称类的内置方法

__init__:初始化函数,在类调用时自动触发

__str__:打印对象的时候自动触发

__del__:删除对象的名称空间,最后才执行

__getattr__:对象.属性获取属性,没有获取到值自动触发

__setattr__:对象.属性赋值的时候自动触发

__call__:在帝乡被调用时自动触发

__new__:在__init__前自动触发,产生一个空的对象

class Foo(object):
'''
以下均是类的内置方法,
''' def __new__(cls, *args, **kwargs):
print(cls)
return object.__new__(cls) # 产生一个空的对象 def __init__(self):
print("在类调用时触发") def __str__(self):
return "在打印对象的值时触发" def __del__(self):
print("最后执行该方法,删除内存地址") def __getattr__(self, item):
return "没有获取对象属性时触发" def __setattr__(self, key, value):
print("设置对象属性值时触发")
print(key,value)
self.__dict__[key] = value def __call__(self, *args, **kwargs):
print("调用对象时触发") f = Foo()
# 打印对象
print(f)
# <class '__main__.Foo'>
# 在类调用时触发
# 在打印对象的值时触发
# 最后执行该方法,删除内存地址 # 获取对象属性x
print(f.x)
# <class '__main__.Foo'>
# 在类调用时触发
# 在打印对象的值时触发
# 没有获取对象属性时触发
# 最后执行该方法,删除内存地址 # 对象赋值新的属性
f.x = "x"
print(f.x)
# <class '__main__.Foo'>
# 在类调用时触发
# 在打印对象的值时触发
# 没有获取对象属性时触发
# 设置对象属性值时触发
# x x
# x
# 最后执行该方法,删除内存地址 # 对象调用
f()
# <class '__main__.Foo'>
# 在类调用时触发
# 在打印对象的值时触发
# 没有获取对象属性时触发
# 设置对象属性值时触发
# x x
# x
# 调用对象时触发
# 最后执行该方法,删除内存地址 class MyFile:
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):
res = self.f.read()
print(res) # 使用del内置函数,在最后执行,就会调用关闭文件操作
def __del__(self):
self.f.close()
print("文件关闭成功") f = MyFile("settings.py")
f.file_open()
f.file_read() print("程序结束,对象将被销毁!")

单例模式

单例模式指的是单个实例,实例指的是调用类产生的对象

实例化多个对象时会产生不同的内存地址,单例可以让所有调用者,在调用类产生对象的情况下都指向同一份内存地址,例如,打开文件

单例模式目的:为了减少内存占用

class File:
__instance = None # 单例模式1
# 使用类的绑定方法,
@classmethod
def singleton(cls,file_name):
# 类中设置一个私有属性__instance,
# 在类自己调用完成产生一个对象,将这个对象赋值给类的这个属性,
# 如果这个类属性有对象了,就说明已经实例化过了无需再次实例化,直接返回
# 外部调用者只需调用其方法即可使用单例模式操作对象
if not cls.__instance:
obj = cls(file_name)
cls.__instance = obj
return cls.__instance # 单例模式2
# 使用__new__产生一个空的对象,相当于创建一个空的对象,调用时相当于多个变量指向这个对象
def __new__(cls, *args, **kwargs):
if not cls.__instance:
cls.__instance = object.__new__(cls)
return cls.__instance
'''
实例化出来的对象内存地址一样
<__main__.File object at 0x000000000295C668>
<__main__.File object at 0x000000000295C668>
<__main__.File object at 0x000000000295C668>
''' 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 read(self):
res = self.f.read()
print(res) # def __del__(self):
# self.f.close() f1 = File("settings.py")
f2 = File("settings.py")
f3 = File("settings.py")
print(f1)
print(f2)
print(f3)
# 如下:产生的三个对象 内存地址均不同
# <__main__.File object at 0x000000000298C6D8>
# <__main__.File object at 0x000000000298C710>
# <__main__.File object at 0x000000000298C6A0> # 让其成为单例模式调用
f1 = File.singleton("settings.py")
f2 = File.singleton("settings.py")
f3 = File.singleton("settings.py")
print(f1)
print(f2)
print(f3)
# 如下:产生的三个对象 内存地址均相同
# <__main__.File object at 0x0000000009F6F908>
# <__main__.File object at 0x0000000009F6F908>
# <__main__.File object at 0x0000000009F6F908>

Python-面向对象之高级进阶的更多相关文章

  1. Python面向对象编程高级特性

    ***这里还是根据网上资料,主要是廖雪峰老师的教程学习的笔记,主要介绍python面向对象的高级特性,笔记不全,只是记录自己觉得容易出错的地方*** 1.python作为一种动态语言,他的动态绑定机制 ...

  2. python之面向对象的高级进阶

    一 .isinstance(obj,cls)和issubclass(sub,super) isinstance(obj,cls)检查是否obj是否是类 cls 的对象 class Foo(object ...

  3. Python面向对象的高级编程

    数据封装.继承和多态只是面向对象程序设计中最基础的3个概念.在Python中,面向对象还有很多高级特性,允许我们写出非常强大的功能. 我们会讨论多重继承.定制类.元类等概念. 使用__slots__ ...

  4. Python 面向对象之高级编程

    7.面向对象高级编程 7.1使用__slots__ python动态语言,new 对象后绑定属性和方法 Tip:给一个实例绑定的方法,对其他对象无效.可以通过对class绑定后,所有对象可以调用该方法 ...

  5. python面向对象编程进阶

    python面向对象编程进阶 一.isinstance(obj,cls)和issubclass(sub,super) isinstance(obj,cls)检查是否obj是否是类 cls 的对象 1 ...

  6. python 面向对象(进阶篇)

    上一篇<Python 面向对象(初级篇)>文章介绍了面向对象基本知识: 面向对象是一种编程方式,此编程方式的实现是基于对 类 和 对象 的使用 类 是一个模板,模板中包装了多个“函数”供使 ...

  7. Python开发【第七篇】:面向对象 和 python面向对象进阶篇(下)

    Python开发[第七篇]:面向对象   详见:<Python之路[第五篇]:面向对象及相关> python 面向对象(进阶篇)   上一篇<Python 面向对象(初级篇)> ...

  8. python 面向对象进阶之内置方法

    一 isinstance(obj,cls)和issubclass(sub,super) 1.1,isinstance(obj,cls)检查是否obj是否是类 cls 的对象 class Foo(obj ...

  9. 【转】python 面向对象(进阶篇)

    [转]python 面向对象(进阶篇) 上一篇<Python 面向对象(初级篇)>文章介绍了面向对象基本知识: 面向对象是一种编程方式,此编程方式的实现是基于对 类 和 对象 的使用 类 ...

  10. python 面向对象高级应用(三)

    目录: isinstance(obj,cls)和issubclass(sub,super) 反射 __setattr__,__delattr__,__getattr__ 二次加工标准类型(包装) __ ...

随机推荐

  1. C盘清理垃圾

    经常清理C盘垃圾,会让系统运行更快,避免死机,今天教大家一种简单实用的方法,用文本文档清理垃圾: 1:在电脑桌面空白处右键-建立文本文档: 2:把以下代码复制到文本里 @echo offecho 正在 ...

  2. 史上最全Html和CSS布局技巧

      单列布局水平居中 水平居中的页面布局中最为常见的一种布局形式,多出现于标题,以及内容区域的组织形式,下面介绍四种实现水平居中的方法(注:下面各个实例中实现的是child元素的对齐操作,child元 ...

  3. python 取出aws中ip有,zabbix中没有的ip

    #!/usr/bin/env python3# coding=utf-8import requestsimport jsonimport boto3 headers = {'Content-Type' ...

  4. 人脸识别-常用的数据库Face Databases From Other Research Groups

    Static/Videos Static Single/Multiple faces Single? Gray/Color Color Resolution Vaious Face pose Fron ...

  5. 关于用Linux桌面版当工作系统这件事

    Linux稳定性好,Linux软件开放--不过等到决定把Linux当作日常工作用系统时,就一言难尽了-- 我日常工作的需求有: 笔记本扩展屏幕 Golang开发 docker/kubernetes 输 ...

  6. C盘清理记——罪魁Visual Studio

    话不啰嗦,单刀直入:在C:\ProgramData\Microsoft Visual Studio文件夹下,VS会自动记录IntelliTrace File,久而久之,会无限消耗磁盘空间,直接到塞满C ...

  7. Oracle18C安装后首次创建数据库并用sql developer 创建连接和用户

    注意: SQL Developer 不能用于创建Oracle数据库,只能用来连接已经创建的数据库,数据库的建立要通过Database Configuration Assistant(DBCA)来完成. ...

  8. 2019云栖大会开幕,5G边缘计算成首日焦点

    9月25日,全球顶尖科技盛会——2019云栖大会如期上演,1000余位当代技术领军人物与数万名开发者集结杭州,聚焦数字经济,共话面向未来20年的基础科学.科技创新与应用突破.其中,边缘计算技术领域因5 ...

  9. duilib教程之duilib入门简明教程12.简单控件介绍

    前面的教程应该让大家对duilib的整体有所映像了,下面就来介绍下duilib具体控件的使用.    由于官方没有提供默认的控件样式,所以我就尽量使用win7或者XP自带的按钮样式了,虽然界面比较土鳖 ...

  10. 新金融ABS如何做?听听这几十家券商、互金高管的经验之谈

    新金融ABS如何做?听听这几十家券商.互金高管的经验之谈 2016-11-24 零壹财经 ID:36104743 时间:2016年11月初 地点:北京东城区南湾子3号院(场地提供方:无讼.天同律师事务 ...