首页 > 其他分享 >魔法、反射、异常

魔法、反射、异常

时间:2023-06-28 18:57:37浏览次数:23  
标签:__ 反射 name self 魔法 stu print 异常 def

魔术方法(内置方法)

魔术方法:类里面内置的双下划线开头的一些方法,他们具有一些特殊的功能,称之为魔术方法,简称魔法。(掌握每个方法什么时候执行)

1.__str__,__repr__方法

__str__方法:在打印或者输出对象时,才会被触发执行,此方法的内部返回值必须是字符串类型,return后面返回什么字符串,程序最后就打印什么结果

__repr__方法:功能与str一样,两者同时出现,支持str,因为str的优先级高于repr。

#1. __str__, __repr__方法
class Cake():
    def __init__(self,price,size):
        self.price = price
        self.size =size
    """__str__:在打印或输出对象时,会被触发执行"""
    def __str__(self):
        print('from str')
        return '123' # 返回值必须是字符串类型,否则会报错!
                     # return返回什么字符串,程序最后打印就是什么字符串
    """__repr__: 功能和__str__一样,但是如果两者同时出现,只会执行__str__。"""
    def __repr__(self):
        print('from repr')
        return 'price1: %s' % self.price #  price1: 8 返回值必须是字符串类型,同 __str__一样

cake = Cake(8,320)
print(cake)
#结果为:from str
#       123

2.__del__方法

__del__方法:在程序结束运行时或者在删除对象时,都会自动触发执行。

作用: 可以做一些垃圾清理

class Cake():
    def __init__(self,price,size):
        self.price = price
        self.size =size
        self.f = open('a.txt','w',encoding='utf8')

    """__del__:在程序结束运行时会被触发执行、当删除对象时也会自动触发执行"""
    def __del__(self):
        print('from del')
        """可以做一些清理垃圾的操作"""

cake =Cake(6,200) # from del
del cake # from del

3.isinstance(obj,cls)和issubclass(sub,super)

isinstance(obj,cls):判断对象obj是否是由cls类产生的,或者判断数据类型
issubclass(sub,super): 判断 sub 是否是super的子类
#3. isinstance(obj,cls)和issubclass(sub,super)
class Animal():
    pass
class Cat(Animal):
    pass
cat =Cat()
'isinstance(obj,cls):判断对象obj是否是由cls类产生的,或者判断数据类型'
print(isinstance(cat, Cat))  # True ,对象cat ,是由Cat类产生的
print(isinstance("hi cat", str)) # True, 判断"hi cat"是不是字符串
'issubclass(sub,super): 判断 sub 是否是super的子类'
print(issubclass(Cat, Animal))  # True  查看Cat是不是Animal的子类

 4. __doc__方法

__doc__方法:查看类内部的注释,只能查看自己的注释,继承的父类的注释查看不了。

# 4.__doc__方法
class Foo():
    """
       author:huahua
       date:2023-05-20
       email:喵喵喵@163.com
       这是注释
    """
    pass

class Bar(Foo):
    """from Bar"""
    pass
a = Bar
print(a.__doc__) # from Bar

5.__enter__和__exit__

with:上下文管理器,可以自动打开、关闭文件。

__enter__:出现with语句,对象里的__enter__被触发,有返回值的话就会赋值给as 声明的变量。

__exit__:当with中的代码执行完毕时,才开始执行__exit__

# 5.__enter__和__exit__
class Open():
    def __init__(self,name):
        self.name =name

    def __enter__(self):
        print('执行了enter')
        return 123

    def __exit__(self, exc_type, exc_val, exc_tb):
        print('with中代码块执行完毕时执行exit')
        print(exc_type)  # 异常类型 <class 'AttributeError'>
        print(exc_val)  # 异常值 ***着火啦,救火啊***
        print(exc_tb)  # 追溯信息 <traceback object at 0x0000022CEAF67888>
        # 当return True,则会正常执行完代码,直到走完程序,且exc_type、exc_val、exc_tb的返回值都为None
        # return True

with Open('a.txt') as f: # with语句出现,先执行 __enter__的代码体
    print('=====>执行代码块')# 再执行with语句中的代码
    print(f) # __enter__中的return返回值,赋值给了f
    raise AttributeError('***着火啦,救火啊***') # 当__exit__中有 return True时,raise不会抛出异常,程序正常执行
print('0'*100) # 不会执行

结果:

6. __getattr__,__setattr__,__delattr__

__getattr__:当找的属性不存在时,就会触发执行

__setattr__:设置属性时,触发点语法

__delattr__: 删除属性时会触发执行

class Foo():
    x = 1

    def __init__(self, y):

        self.y = y
    def __getattr__(self, item):
        print('from getattr:你找的属性不存在')
    def __setattr__(self, key, value):
        print('from setattr')
    def __delattr__(self, item):
        print('----> from delattr')

obj = Foo(20) #  from setattr
# obj.z # obj中并没有z这个属性,from getattr:你找的属性不存在
obj.z = 1 # from setattr
# print(obj.__dict__) # {},重新设置了obj的属性,所以里面什么也没有是个空字典
# obj.__dict__['z'] = 2
# print(obj.__dict__) #{'z': 2}
del obj.y # ----> from delattr

7.__getitem__,__setitem__,__delitem__

__getitem__:用对象获取一个不存在属性时,会触发

__setitem__: 当设置一个不存在的属性时,会触发

__delitem__:删除属性时,会触发

class Foo(object):
    def __init__(self, name):
        self.name = name

    def __getitem__(self, item):
        print(item) # age
        print("我执行了")
        print(self.__dict__[item]) # None
        
    def __setitem__(self, key, value):
        print("我也执行了") 
        print(key, value) # age 19
        self.__dict__[key] = value
        
    def __delitem__(self, key):
        print('del obj[key]时,我执行')
        self.__dict__.pop(key)
        
    def __delattr__(self, item):
        print('del obj.key时,我执行')
        self.__dict__.pop(item)

obj = Foo('kevin')
obj['age'] = 19    # 设置一个不存在的属性,触发__setitem__  ,我也执行了
print(obj['age']) # 查找属性
del obj['age'] # 删除属性

8. __call__

__call__:对象+()会触发类内部的__call__,如果有返回值,就会把返回值给对象+()

# __call__
class Foo:

    def __init__(self):
        pass

    def __call__(self, *args, **kwargs):
        print('__call__')
        return '123'

obj = Foo()

print(obj())  # 对象加括号  # __call__
                          # 123

反射

反射:通过字符串的形式来操作对象的属性

getattr(stu,'name'): 从对象stu中获取name属性

getattr(stu,'函数名'):可获得函数的内存地址

当属性不存在时,报错,如果属性名后面有默认值,就是输出默认值。

class Student():
    def __init__(self, name, age ):
        self.name = name
        self.age = age

    def index(self):
        print('Student.index')

stu = Student('花', 20)
res = getattr(stu,'name')
print(res) # 花
# res1 = getattr(stu,'name1')
# print(res1) # name1属性不存在,会报错 #AttributeError: 'Student' object has no attribute 'name1'
res2 = getattr(stu,'name1',666)
print(res2) # name1不存在,但是后面有默认值。所以不会报错,并且会输出默认值
res3 = getattr(stu,'index')
print(res3) # <bound method Student.index of <__main__.Student object at 0x0000024060610898>>
res3() # Student.index

setattr(stu,‘heigh’,180)  :设置一个不存在的属性,若存在,则为修改操作,不存在则为添加。

class Student():
    def __init__(self, name, age ):
        self.name = name
        self.age = age

    def index(self):
        print('Student.index')

stu = Student('花', 20)
print(stu.__dict__) # {'name': '花', 'age': 20}
res=setattr(stu,'height',180)
print(stu.__dict__) # {'name': '花', 'age': 20, 'height': 180}
res1 =setattr(stu,'age',18)
print(stu.__dict__) # {'name': '花', 'age': 18, 'height': 180}

delattr(stu,'age'): 删除

hasattr(stu,'name'): 返回布尔值,判断属性或者方法是否存在

class Student():
    def __init__(self, name, age ):
        self.name = name
        self.age = age

    def index(self):
        print('Student.index')

stu = Student('花', 20)
print(stu.__dict__) # {'name': '花', 'age': 20}
res=setattr(stu,'height',180)
print(stu.__dict__) # {'name': '花', 'age': 20, 'height': 180}
res1 =setattr(stu,'age',18)
print(stu.__dict__) # {'name': '花', 'age': 18, 'height': 180}
res2 = delattr(stu,'age')
print(stu.__dict__) #{'name': '花', 'height': 180}
res3 = hasattr(stu,'age')
print(res3) # False
res4 = hasattr(stu,'index')
print(res4) #True

异常

异常:错误发生的信号,我们必须要做处理,否则,后续代码无法正常运行

try:
    被检测的代码
except 异常类型:
    pass
else:
    print() #只有当被检测代码没有异常才会走
finally:
    print() # 不管什么时候都会走
    
 """以上结构是我们为了捕捉代码中出现的异常"""

自己抛出异常

 class Animal():
    # @abc.abstractmethod
    def speak(self):
        raise Exception("请先实现speak方法")

class People(Animal):
    def speak(self):
        pass
    # pass

"""主动抛出异常"""
stu = People()
stu.speak()

 自定义异常

class MyException(BaseException):
    def __init__(self, msg):
        self.msg = msg

    def __str__(self):
        return self.msg


raise MyException("这是异常信息")

标签:__,反射,name,self,魔法,stu,print,异常,def
From: https://www.cnblogs.com/Lucky-Hua/p/17512293.html

相关文章

  • Java反射
    动态语言:是指程序在运行是可以改变其结构,新的函数可以引进,已有的函数可以被删除等结构上的变化。比如常见的JavaScript就是动态语言,除此之外Ruby、Python等也属于动态语言,而C、C++则不属于动态语言。从反射角度说,Java属于半动态语言。反射机制概念(运行状态中知道类所有的属性和方法......
  • python基础 内置方法、反射,异常剩余内容
    魔术方法(内置方法)类类里面内置的双下划线开头的一些地方,它们具有特殊的功能,我们称之为魔术方法,简称魔法比如:__init__1.__str__,__repr__方法__str__:当打印和输出对象时,自动触发str方法,但还是str必须要有返回值,不然会报错,而且返回值必须是字符串。__repr__:它的使用......
  • 苹果开发者账号注册设备异常是怎么回事
    对于近期新续费的,或者新注册的苹果开发者账号,有一些开发人员发现,当在开发者账号里添加了一定数目的设备后,会出现如下的提示信息: Registrationisbeingprocessedforthesedevices.Theymaybecomeavailablefordevelopmentandadhocdistributionin24to72hours.......
  • python基础day34 魔术方法和反射
    魔术方法(内置方法)类里面内置的双下划线开头的一线方法,他们具有特殊的功能,我们称之为是魔术方法,简称魔法。eg:__init__魔术方法的学习之需要掌握每个方法什么时候触发或者执行1.__str__,__repr__方法classStudent():def__init__(self,name,age,gender):s......
  • springboot 自定义异常 全局异常处理器
    创建自定义异常类,继承 RuntimeException类1publicclassCustomExceptionextendsRuntimeException{2publicCustomException(Stringmessage){3super(message);4}5}在指定情况下抛出该异常,代码如下: @ServicepublicclassCategoryServiceIm......
  • BAT 大厂Android研发岗必刷真题:Android异常与性能优化相关面试问题
    今天来讲一讲在面试中碰到的Android异常与性能优化相关问题:1、anr异常面试问题讲解a)什么是anr?应用程序无响应对话框b)造成anr的原因?**主线程中做了耗时操作c)android中那些操作是在主线程呢?activity的所有生命周期回调都是执行在主线程的Service默认是执行在主线程的BroadcastR......
  • Java中的异常处理
    Java异常类层次结构图 在Java中,所有的异常都有一个共同的祖先java.lang包中的Throwable类。Throwable:有两个重要的子类:Exception(异常)和Error(错误),二者都是Java异常处理的重要子类,各自都包含大量子类。 Error(错误):是程序无法处理的错误,表示运行应用程序中较严重问题。大多数......
  • 解决:远程连接mysql:报异常,1044 - Access denied for user ‘root‘@‘%‘ to database
    Navicat报错:使用Navicat远程连接,Docker中的mysql5.6时报异常,:1044-Accessdeniedforuser'root'@'%'todatabase'xxx'问题原因:(1)根本原因:远程连接用户权限不足!(2)直接原因:应该是创建远程连接用户‘root@%’时,没有添加访问数据库的权限。解决办法:#这里为刚才创建的root@......
  • Python | 魔法函数`__iter__`的用法
    下面是找到的一个比较好的科学解释:Python中可迭代对象(Iterable)并不是指某种具体的数据类型,它是指存储了元素的一个容器对象,且容器中的元素可以通过__iter__()方法或__getitem__()方法访问。__iter__方法的作用是让对象可以用for…inobj循环遍历,__getitem__()方法是......
  • Python | 魔法函数`__contains__`的用法
    在python的字符串、列表、元组、结合等对象的时候,经常使用in的方法,一个类的对象能够使用in,就是因为这个类实现了__contains__魔法函数如下面的代码,演示了类的对象使用in的情形classStudent():def__init__(self,name):self.name=namedef__contains__(self......