程序员最近都爱上了这个网站  程序员们快来瞅瞅吧!  it98k网:it98k.com

本站消息

站长简介/公众号

  出租广告位,需要合作请联系站长

+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

2022-02(10)

2022-03(3)

Python基础学习(十二)--第十二天

发布于2019-08-20 11:59     阅读(1121)     评论(0)     点赞(27)     收藏(0)


一、常用魔方方法

(一)__del__()方法--销毁魔术方法

当一个对象在内存中被销毁的时候自动执行,至少有一个self参数,接收对象。

程序自动调用此方法,不需要我们手动调用。

  1. class A():
  2. num=0 # 类属性,也叫静态属性
  3. def __init__(self,name):
  4. A.num+=1 # 每定义一个对象,计数器加1
  5. self.name=name
  6. def __del__(self):
  7. A.num-=1
  8. print(self.name,'被删除,还剩下{}个对象'.format(A.num))
  9. a=A('张三')
  10. b=A('李四')
  11. c=A('王五')
  12. print(A.num)
  13. del a # 自动调用__del__()
  14. del b
  15. del c

(二)__call__()方法

可以让类的实例具有类似于函数的行为,进一步模糊了函数和对象之间的概念。

对象后面加括号,就像函数一样触发执行。形如:对象名()或类名()()。

  1. class A():
  2. def __init__(self,num):
  3. self.num=num
  4. def __call__(self,n):
  5. return self.num*n
  6. a=A(7)
  7. print(a(9))
  8. print(A(3)(7))

斐波那契序列

  1. class Fib():
  2. def __init__(self):
  3. pass
  4. def __call__(self,month):
  5. lst=[]
  6. a,b=1,1
  7. n=1
  8. while n<=month:
  9. lst.append(a)
  10. a,b=b,a+b
  11. n+=1
  12. return lst
  13. f=Fib()
  14. for i in range(1,10):
  15. print(f(i))
  1. class Fib():
  2. def __init__(self):
  3. pass
  4. def __call__(self,month):
  5. a,b=0,1
  6. n=1
  7. while n<=month:
  8. a,b=b,a+b
  9. n+=1
  10. return a
  11. f=Fib()
  12. m=int(input('请输入:'))
  13. print(f(m))

(三)__str__()方法和__repr__()方法--改变对象的字符串显示

__repr__()是__str_()方法的备胎,找不到__str__()就会找它。

%s和str()默认调用__str__()。

%r和repr()默认调用__repr__()。

  1. class Per():
  2. def __init__(self, name, age):
  3. self.name = name
  4. self.age = age
  5. def __str__(self):
  6. return '%s:%d'%(self.name,self.age)
  7. def __repr__(self):
  8. return '我叫{},年龄{}'.format(self.name,self.age)
  9. a=Per('张三',19)
  10. print(a)
  11. print(str(a))
  12. print('%s'% a)
  13. print('%r'% a)
  14. print(repr(a))

(四)__new__()方法--实例化魔方方法

在实例化对象是自动触发。

至少有一个cls参数,接收当前类,返回一个对象实例。

先触发__new__()才会触发__init__()。

  1. class Stu():
  2. # 实例化
  3. def __new__(cls, *args, **kwargs):
  4. print('111111111111111111111')
  5. # 如果不写这句,就没有创建对象,只打印111,不打印222。调用父类的__nuw__()方法就可以创建对象了。
  6. return object.__new__(cls)
  7. # 初始化
  8. def __init__(self,name,age):
  9. print('222222222222222222222')
  10. self.name=name
  11. self.age=age
  12. zs=Stu('张三',19)
  13. print(zs.name)

(五)is和==的区别

is比较两个对象的id值是否相等,是否指向同一个内存地址。

==比较的是两个对象的内容是否相同,默认调用对象的__eq__()方法。

继承自object的__eq__()方法比较两个对象的id。但对于自定义的对象,一般认为对象的值相同就是同一个对象,因此需要复写__eq__()方法。

  1. class Stu():
  2. def __init__(self,name,age):
  3. self.name=name
  4. self.age=age
  5. def __eq__(self, other): # equal
  6. return self.__dict__==other.__dict__
  7. a=Stu('张三',19)
  8. b=Stu('张三',19)
  9. c=Stu('李四',20)
  10. print(a==b) # True
  11. print(a is b) # False
  12. # !!!重点
  13. d=[]
  14. d.append(a)
  15. if b not in d: # 去调用了__eq__(),发现a==b,所以列表中只有一个对象。说明这里的in是根据==判断的。
  16. d.append(b)
  17. print(d)

(六)__hash__()方法--哈希/散列

将一个不定长的输入,通过哈希函数变换成一个定长的输出,即哈希值。

这种哈希变换是一种单向运算,具有不可逆性即不能根据哈希值还原出输入的信息。

set集合要求数据是可哈希的,因为set集合会默认调用对象的__hash__()函数进行快速查询,如果找到了则调用对象的__eq__()函数判断两个是否相同,如果相同则不添加。

在自定义类中,如果没有实现__eq__()和__hash__(),会继承object的__eq__()和__hash__()。如果只定义__eq__()方法,没有定义__hash__(),__hash__()方法会隐式设置为None。

hash()函数默认调用object类的__hash__()方法,Hash值是对象的id值的十六分之一。

  1. class Stu():
  2. def __init__(self,name):
  3. self.name=name
  4. a=Stu('张三')
  5. b=Stu('李四')
  6. c=Stu('王五')
  7. s={a,b,c}
  8. print(s)
  9. print(hash(a))
  10. print(id(a)/16)
  11. 结果:
  12. {<__main__.Stu object at 0x0000000002877C50>, <__main__.Stu object at 0x0000000001E498D0>, <__main__.Stu object at 0x000000000286D0F0>}
  13. 1984909
  14. 1984909.0
  1. class Stu():
  2. def __init__(self,name):
  3. self.name=name
  4. def __eq__(self, other):
  5. print('222')
  6. return self.name==other.name
  7. def __hash__(self):
  8. print('111')
  9. return hash(self.name)
  10. a=Stu('张三')
  11. b=Stu('李四')
  12. c=Stu('张三')
  13. print(id(a))
  14. print(id(b))
  15. print(id(c))
  16. print(a==c)
  17. d={a,b,c}
  18. print(d)
  19. 结果:
  20. 42630336
  21. 42630224
  22. 42683696
  23. 222
  24. True
  25. 111
  26. 111
  27. 111
  28. 222
  29. {<__main__.Stu object at 0x00000000028A7CC0>, <__main__.Stu object at 0x00000000028A7C50>}

二、类的常用函数

(一)issubclass()--检测一个类,是否为另一个类的子类

格式:issubclass(被检测类,父类)。若一次判断多个父类,有一则为真。

  1. class A():
  2. pass
  3. class B(A):
  4. pass
  5. print(issubclass(B,A))

(二)isinstance()--检测一个对象是否为某个类的对象

格式:isinstance(对象,类)。若一次判断多个类,有一则为真。

  1. class A():
  2. pass
  3. a=A()
  4. print(isinstance(a,A))

(三)反射函数

1.hasattr()--判断是否有此变量,返回值为bool类型

2.getattr()--获取属性值或者获取方法变量的地址,返回值为数值

3.delattr()--删除类或者对象的属性或方法

4.setattr()--给类或者对象设置属性或者方法

  1. class A():
  2. dog=0
  3. def hehe(num):
  4. print(num)
  5. setattr(A,'dog',90)
  6. print(A.__dict__)
  7. setattr(A,'cat',10)
  8. print(A.__dict__)
  9. a=A()
  10. print(a.__dict__)
  11. setattr(a,'haha',1999)
  12. print(a.__dict__)
  13. a.hehe=2022
  14. print(a.__dict__)
  15. print(getattr(A,'dog'))
  16. f=getattr(A,'hehe')
  17. f(1)
  18. delattr(A,'dog')
  19. print(hasattr(A,'dog'))
  1. class A():
  2. def f1(self):
  3. print('我是f1')
  4. def f2(self):
  5. print('我是f2')
  6. def f3(self):
  7. print('我是f3')
  8. print(A.__dict__)
  9. a=A()
  10. while True:
  11. f=input('请输入你想调用的方法:')
  12. if hasattr(A,f):
  13. fc=A.__dict__.get(f)
  14. fc(a)
  15. else:
  16. print('A类没有',f)

5.反射导入的模块中的属性、函数、类

t1模块:

  1. d='周2'
  2. def func(a):
  3. print('你好是函数',a)
  4. class A():
  5. def __init__(self,name):
  6. self.name=name

t2:

  1. import t1
  2. x=getattr(t1,'d')
  3. print(x)
  4. f=getattr(t1,'func')
  5. f('张三')
  6. cls=getattr(t1,'A')
  7. a=cls('张三')
  8. print(a.name)

6.反射自己模块中的属性和函数

  1. import sys
  2. zhutou=299
  3. def func():
  4. print('aaaaaaaaaaaaaaaaa')
  5. # 查看所有模块
  6. print(sys.modules)
  7. # 反射当前模块
  8. print(sys.modules['__main__'])
  9. # 反射当前模块中的zhutou变量
  10. x=getattr(sys.modules['__main__'],'zhutou')
  11. print(x)
  12. x=getattr(sys.modules['__main__'],'func')
  13. x()

7.反射内置模块

  1. import time
  2. print(time.time())
  3. t=getattr(time,'time')
  4. print(t())

 



所属网站分类: 技术文章 > 博客

作者:44344df

链接:https://www.pythonheidong.com/blog/article/49193/823087e63193ba776fc5/

来源:python黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

27 0
收藏该文
已收藏

评论内容:(最多支持255个字符)