Python基础 笔记11

一、笔记说明

  1. 本博客专栏《Python基础》的所有笔记均为.py格式文件,复制后均可无误执行(注意修改文件路径,每个人的工作区不一样)。
  2. 在复制代码时,若代码段标明了文件名称,即该笔记包含多个文件,请注意每个代码段标明的文件名称,并在本地创建文件夹以便于运行。
  3. 代码运行环境Python3.7.9,建议使用Pycharm2020.1作为编辑器,使用Anaconda3作为包管理器。

二、代码部分

# Python笔记13.py

class Base:
    def __init__(self):
        print("initizliaing...")

a=Base()
b=Base()
print(id(a))
print(id(b))
print("1.此处对a,b实例分别调用 __init__(self):所以地址不同!")


class Base(object):#此处可以不添加(object),编译器会自动调用(object)对象
    def __init__(self):
        print("initizliaing...")
    def __new__(cls, *args, **kwargs):#有new方法时不执行init方法
        super().__new__(cls)#参数是一个类
        """
        此处引用父级变量是为了在已定义的new方法中引用object类的new方法;
        即new方法的嵌套;
        有new方法时不执行init方法
        new方法的参数是类名+无穷基本数据元素+无穷字典数据元素;

        """
        print("new...")

a=Base()
b=Base()
print(id(a))
print(id(b))
print("2.此处在a实例初始化后,对b实例重写了父级的__new__(cls, *args, **kwargs):所以地址相同!")


print("3.为多个相同的同源实例添加相互关联/影响的方法(改为相同地址/即单例模式)")
class Base:#此处可以不添加(object),编译器会自动调用(object)对象
    def __init__(self):
        print("initizliaing...")
    def __new__(cls, *args, **kwargs):#有new方法时不执行init方法
        print("只会new一次!其余都是init初始化!")
        if not hasattr(Base,"name"):#hasattr() 函数用于判断对象是否包含对应的属性。
            cls.name=super().__new__(cls)#若没有初始化则引用父类new方法
        return  cls.name#参数是一个类
    def __getattr__(self, item):#当获取实例属性时,如果属性不存在就自动调用__getattr__方法;防止65行报错
        return "没有这个属性!"
        # """
        # 此处为单例模式
        # 只让new方法创建一个实例
        # 保存第一个实例对象
        # 其余情况返回第一个实例
        # """

a=Base()
a.name="eifv"
b=Base()#注意代码执行顺序
print(a.name)
print(b.name)
print(id(a))
print(id(b))
print("注意:单例模式只可以手动添加类的属性,此处以“name”属性举例")

print("4.1查询实例是否含有特定属性,返回逻辑值:")
print(hasattr(a,"name"))
print("4.2查询实例是否含有特定属性,返回属性值,没有则报错;执行需要满足两个条件:一是访问对象属性、二是触发AttributeError异常")
print(getattr(a,"name"))
print("定义魔术方法可避免其报错:在实例对应类中定义__getattr__(self, item):"
      "详见  3")
print(getattr(a,"typ"))
print("4.3查询实例是否含有特定属性,返回属性值,否则报错;该方法可以拦截对对象属性的所有访问企图,小心递归:"
      "一般用于在访问某个对象前执行某种操作。")
print(a.__getattribute__("name"))

print("5.更改/添加类属性:有则改,无则加")
a.name="woiod"
print("5.1",a.name)
setattr(a,"name","owuej")
print("5.2",a.name)
a.__setattr__("name","4g6vsdg6s")
print("5.3",a.name)

print("6.删除类属性:没找到就报错")
delattr(a,"name")
print("6.1类属性已删除:",a.name)
# a.__delattr__("name")
# print("6.2类属性已删除:",a.name)

print("7.get/set/delete魔术方法:实现了这三个魔术方法的类称之为描述符:"
      "获取,设置,删除属性")
class MyAtrribute:
    def __get__(self, instance, owner):
        print("get...")
    def __set__(self, instance, value):
        print("set...")
    def __delete__(self, instance):
        print("del...")

class MyClass:
    m=MyAtrribute()

a=MyClass()
a.m
a.m=123
delattr(a,"m")

print("8.1装饰器:@[装饰器命令]")
def f1(obj):#此处为回调
    print("f1")
    def f2():
        print("f2")
        obj()#调用func()
    return f2

@f1#使得下方方法func()传入参数f1(),与116行代码作用基本相同
def func():
    print("func")
func()
print("************与116行代码作用基本相同************")
f=f1(func)
f()
print("对于外部方法,在引用装饰器后,会使得使用装饰器的外部方法先执行装饰器对应的类的代码")

print("8.2三个内置装饰器:作用于类方法")
class A:
    @property#访问方法的时候访问属性的格式,无需参数
    def area(self):
        print("area(self):")

    @classmethod#传出类相关信息
    def show(self):
        print(self)

    @staticmethod#关闭自动传输实例或参数的功能,不传参不执行,变成静态方法,无需实例化后再调用
    def func(self):
        print(self)
        print("func!!!")

a=A()
a.area
a.show()
a.func(123)

print("8.3类装饰器:对于外部方法,在引用装饰器后,会使得使用装饰器的外部方法先执行装饰器对应的类的代码"
      "与8.1相同")
class Test_Class:
    def __init__(self,func):
        self.func=func

    def __call__(self, *args, **kwargs):
        print("call...")
        return self.func

@Test_Class
def fun_test():#修饰后执行类的代码
    print("fun_test():")

f=fun_test()
f()
print("总结:装饰器就是为了对一堆方法(无论其是否在类里面),要对其全部执行一个操作,比如计算其各个方法的运行时间"
      "使用装饰器,在方法执行前,装饰器会启动并且作用于方法;除了内置装饰器(来自object类),其余装饰器要使用,需要手动编写内容")

print("9.time模块:")
import time
print(time.time())#到现在的时间

三、转载说明

  1. 本文内容完全原创,文章完成时间2021.3.17。
  2. 若要转载本文,请在转载文章末尾附上本文链接:https://blog.csdn.net/qq_35772105/article/details/114919435
  3. 本文代码部分唯一MD5:CFC35FE8B0A368378D50AEF7A5FDF262。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

魔菲赫伯特

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值