python的第九节课笔记(基础高级)
本节课除了魔法方法,其他的了解即可
常用内置函数
属性访问函数
1 2 3 4 5 6 7 8 9 10
| hasattr 判断属性是否存在 hasattr(对象,"属性名") 属性名需要引号包裹 存在返回True 不存在返回False getattr 得到属性值,没有则报错 setattr 设置属性值,有则改无则增 setattr(对象,"属性名", "值") 存在则修改,不存在则新增 delattr 删除属性 delatrr(对象,"属性名") 删除对象对应的属性
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
| class Person(): def __init__(self, name, age, sex): self.name = name self.age = age self.sex = sex
def paly(self): print(f"{self.name}是一个{self.sex}孩子,喜欢打游戏")
def study(self): print(f'{self.name},今年{self.age}岁了,正在上学')
lf = Person("冷风", 28, "男") print(lf.name)
print(hasattr(lf, "sg")) print(hasattr(lf, "sex"))
setattr(lf, "sex", "女") setattr(lf, "sg", "188") print(lf.sex) print(lf.sg) delattr(lf, "sg") delattr(lf, "sex") print(lf.sex) print(lf.sg)
if hasattr(lf, "sg"): getattr(lf, "sg") else: setattr(lf,"sg", 188)
print(lf.sg) print(lf.tz)
|
对象关系方法
1 2 3 4 5 6
| 对象关系属性
issubclass 判断第一个类是否继承于后面类 isinstance 判断实例是否是后面的实例, 考虑继承关系 is 不考虑继承关系 type 也可以判断,但是只能判断单个类
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| class Ape(): pass
class Person(Ape): pass
实例化对象 monkey = Ape() xjy = Person() print(type(monkey), type(xjy))
print(xjy is Ape) print(isinstance(xjy, Ape)) print(issubclass(Person, Ape)) print(issubclass(Ape, Person))
|
属性调用过程
当实例调用一个不存在的属性的时候,会发生报错,
但是如果类中增加__getattr__方法,则不会报错,而是自动执行此方法内的程序
__getattr__:必须要有两个参数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| class Person(): def __init__(self, name, age, sex): self.name = name self.age = age self.sex = sex
def __getattr__(self, item): """ 当出现不存在的时候,会自动调用 :param item: 当前属性 :return: """ return "没有这个属性", item
qy = Person("青云", 18, "女") print(qy.sg) print(qy.name)
|
*魔法方法
Python中很多内置方法左右两边都是两个下划线中间一个英文单词,把这种方法都称之为魔法方法
魔法方法:在特殊场景下由python解释器自动调用,完成某些功能
__new__:
在实例化对象的时候自动调用(最先调用)
功能:创建实例对象
__init__:
在实例化对象的时候自动调用
功能:实例对象属性的初始化
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| 魔法方法: 调用:不需要手动调用,特定场景自动执行 定义: __方法名__
__new__ 场景 在对象要被实例化的时候 功能 创造一个实例化对象 __init__ 场景 对象被实例化之后 功能 初始化对象属性 __str__ 场景 打印对象的时候执行 功能 修改打印对象名的时候的返回值 __repr__ 场景 引用对象的时候执行 __del__ 场景 对象被释放的时候执行 功能 删除
引用对象:通过对象名访问对象的值
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| class Lei(object):
def __new__(cls, *args, **kwargs): """ cls :代指当前的类 self:代指当前对象 # new方法里面原来有很多代码帮助我们创建对象 # 子类和父类重名,覆盖了父类的功能 # 解决: 重新调用父类功能 super(),并且将创建好的对象返回出去 """ print("创建对象的方法") return super().__new__(cls)
def __init__(self, name, age): self.name = name self.age = age print("初始化属性值的方法")
|
单例模式
1 2
| 单例模式: 只有一个对象 操作基于对象属性值的更改
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| class Lei(object):
def __new__(cls, *args, **kwargs): """ 判断这个类是否有对象 没有: 重新调用父类方法创造对象 有: 不需要重新调用,由于已经重写了父类方法,本身就没有对象会被创造出来 """ if not hasattr(cls, "_instance"): cls._instance = super().__new__(cls) return cls._instance
def __init__(self, name, age): self.name = name self.age = age
sw = Lei("圣文", 28) print(sw) print(sw.name) xw = Lei("向往", 24) print(xw) print(sw.name) print(xw.name)
|