一、笔记说明
- 本博客专栏《Python基础》的所有笔记均为.py格式文件,复制后均可无误执行(注意修改文件路径,每个人的工作区不一样)。
- 在复制代码时,若代码段标明了文件名称,即该笔记包含多个文件,请注意每个代码段标明的文件名称,并在本地创建文件夹以便于运行。
- 代码运行环境Python3.7.9,建议使用Pycharm2020.1作为编辑器,使用Anaconda3作为包管理器。
二、代码部分
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):
def __init__(self):
print("initizliaing...")
def __new__(cls, *args, **kwargs):
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:
def __init__(self):
print("initizliaing...")
def __new__(cls, *args, **kwargs):
print("只会new一次!其余都是init初始化!")
if not hasattr(Base,"name"):
cls.name=super().__new__(cls)
return cls.name
def __getattr__(self, item):
return "没有这个属性!"
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)
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()
return f2
@f1
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())
三、转载说明
- 本文内容完全原创,文章完成时间2021.3.17。
- 若要转载本文,请在转载文章末尾附上本文链接:https://blog.csdn.net/qq_35772105/article/details/114919435
- 本文代码部分唯一MD5:CFC35FE8B0A368378D50AEF7A5FDF262。