当前位置:   article > 正文

python基础之类中常见内置方法_nonetype' object has no attribute 'show

nonetype' object has no attribute 'show

一、__del__(self): 对象消失的时候调用此方法。

  1. >>> class cat(object):
  2. def __del__(self):
  3. print("对象消失")
  4. >>> import sys
  5. >>> cat1=cat() #创建一个cat1
  6. >>> sys.getrefcount(cat1) #测试对象的引用个数,比实际大1,此时为2
  7. 2
  8. >>> cat2=cat1 #又创建了一个引用,此时为3
  9. >>> sys.getrefcount(cat1)
  10. 3
  11. >>> sys.getrefcount(cat2)
  12. 3
  13. >>> del cat1 #删除了一个引用,cat1 不在指向对象,cat2还指向对象,此时引用个数为2
  14. >>> sys.getrefcount(cat2)
  15. 2
  16. >>> del cat2 #又删除了一个,此时没有引用指向对象,对象消失,调用__del__()方法
  17. 对象消失

二、类方法 @classmethod

  1. >>> class test(object):
  2. def show(self):
  3. print("This is a class")
  4. @classmethod #定义类方法
  5. def way(cls):
  6. print("This is a class method")
  7. >>> a=test()
  8. >>> a.way() #用对象调用类方法
  9. This is a class method
  10. >>> test.way() #用类调用类方法
  11. This is a class method

三、静态方法:@staticmethod ,一般用于既和类没关系也和对象没关系的使用

  1. >>> class test(object):
  2. def show(self):
  3. print("This is a class")
  4. @staticmethod #定义静态方法
  5. def way( ): #可以没有参数
  6. print("This is a static method")
  7. >>> a=test()
  8. >>> a.way() #对象调用
  9. This is a static method
  10. >>> test.way() #类调用
  11. This is a static method

四、__new__( )方法:静态方法,用于创建对象,__init__( )用于对象的初始化

  1. >>> class test(object):
  2. def show(self):
  3. print("This is show function")
  4. >>> a=test() #调用__new__()方法来创建对象,然后用一个变量来接收__new__()方法的返回值,这个返回值是创建出来对象的引用。调用__init__()方法来初始化对象。

子类中重写__new__( )方法,要调用父类__new__( )方法,要返回对象的引用,对象才能被创建。 

重写__new__( )方法,可以创建单例

  1. <>没返回,没调用父类__new__()方法
  2. >>> class shit(object):
  3. def show(self):
  4. print("-----show----")
  5. def __new__(cls):
  6. print("重写new方法")
  7. >>> a=shit()
  8. 重写new方法
  9. >>> a.show() #没有调用父类__new__(cls)方法,报错
  10. Traceback (most recent call last):
  11. File "<pyshell#11>", line 1, in <module>
  12. a.show()
  13. AttributeError: 'NoneType' object has no attribute 'show'
  14. <> 调用父类的__new__(cls)方法,没有返回
  15. class shit(object):
  16. def show(self):
  17. print("-----show----")
  18. def __new__(cls):
  19. print("重写new方法")
  20. object.__new__(cls)
  21. >>> a=shit()
  22. 重写new方法
  23. >>> a.show()
  24. Traceback (most recent call last):
  25. File "<pyshell#21>", line 1, in <module>
  26. a.show()
  27. AttributeError: 'NoneType' object has no attribute 'show'
  28. <> 有返回,调用父类__new__()方法
  29. >>> class shit(object):
  30. def show(self):
  31. print("-----show----")
  32. def __new__(cls):
  33. print("重写new方法")
  34. return object.__new__(cls) #调用父类的__new__(cls)方法
  35. >>> a=shit()
  36. 重写new方法
  37. >>> a.show()
  38. -----show----

五、__slots__方法:限制对象动态添加属性和方法

  1. >>> class student(object):
  2. __slots__=["name","age"] #添加限制
  3. def __init__(self,stuName,stuAge):
  4. self.name=stuName
  5. self.age=stuAge
  6. >>> student.Persons=100 #对类没有限制
  7. >>> stu1=student("ma dongmei",17)
  8. >>> stu1.gender="girl"
  9. #不可以为对象添加属性,报错
  10. Traceback (most recent call last):
  11. File "<pyshell#18>", line 1, in <module>
  12. stu1.gender="girl"
  13. AttributeError: 'student' object has no attribute 'gender'

对于__slot__有以下几个需要注意的地方:

  • __slots__只对对象进行限制,不对类进行限制
  • __slots__不仅限制类对象的属性,还限制类对象的方法
  • __slots__仅对当前类起作用,对继承的子类不起作用
  • 在子类中定义__slots__,子类允许定义的属性就是自身的__slots__加上父类的__slots__
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/菜鸟追梦旅行/article/detail/186624
推荐阅读
相关标签
  

闽ICP备14008679号