Learning-Python【26】:反射及内置方法

反射的概念

可以用字符串的方式去访问对象的属性,调用对象的方法(但是不能去访问方法),Python 中一切皆对象,都可以使用反射。

反射有四种方法:

hasattr:hasattr(object, name)判断一个对象是否有 name 属性或者 name 方法。有就返回 True,没有就返回 False

getattr:获取对象的属性或者方法,如果存在则打印出来。hasattr 和 getattr 配套使用

  需要注意的是,如果返回的是对象的方法,返回出来的是对象的内存地址,如果需要运行这个方法,可以在后面添加一对()

setattr:给对象的属性赋值,若属性不存在,先创建后赋值

delattr:删除该对象指定的一个属性

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

    def tell_info(self):
        print(‘%s: %s‘ %(self.name, self.age))

obj = Foo("egon", 18)

print(hasattr(obj, "name"))

res1 = getattr(obj, "name")
print(res1)
res2 = getattr(obj, "xxx", None)
print(res2)

setattr(obj, "age", 38)
print(obj.__dict__)
setattr(obj, "gender", "male")
print(obj.__dict__)

delattr(obj, "name")
print(obj.__dict__)

反射

isinstance 和 issubclass

isinstance(obj, cls):检查 obj 是不是 cls 的对象(传两个参数,一个是对象,一个是类)

issubclass(sub, super):检查 sub 是不是 super 的子类(传两个参数,一个是子类,一个是父类)

class Foo:
    pass

class Son(Foo):
    pass

s = Son()
print(isinstance(s, Son))   # 判断s是不是Son的对象
print(type(s) is Son)
print(isinstance(s, Foo))   # 判断s是不是Foo的对象  不精准
print(type(s) is Foo)       # type比较精准

print(issubclass(Son, Foo)) # 判断Son是不是Foo的子类
print(issubclass(Son, object))
print(issubclass(Foo, object))
print(issubclass(int, object))

内置方法

1、__str__ 和 __repr__:改变对象的字符串显示

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

    def __repr__(self):
        return ‘obj in str‘  # 这里只能是return
    # def __str__(self):
    #     return ‘%s obj in str‘%self.name

f = Foo(‘egon‘)
print(f)  # 优先执行__str__里面的内容
# 那么你是不是据地__repr__没用呢?
# print(‘%s‘%f)  #执行的是__str__里面的返回值
# print(‘%r‘%f)  #执行的是__repr__里面的返回值
print(‘==============‘)
print(str(f))  # 当执行str(f)时,会去找__str__这个方法,如果找不到的时候,__repr__这个方法就给替补了
print(repr(f))
# 1.当打印一个对象的时候,如果实现了__str__方法,打印__str__中的返回值
# 2.当__str__没有被实现的时候,就会调用__repr__方法
# 3.但是当你用字符串格式化的时候,%s和%r会分别调用__str__和__repr__方法
# 4.不管是在字符串格式化的时候还是在打印对象的时候,__repr__方法都可以作为__str__方法的替补,但反之则不行
# 5.用于友好的表示对象。如果__str__和__repr__方法你只能实现一个: 先实现__repr__

2、__del__:会在对象被删除时自动触发执行,用来在对象被删除前回收系统资源

class Foo:
    def __del__(self):
        print(‘===>‘)

obj=Foo()
# del obj
print(‘其他代码...‘)

原文地址:https://www.cnblogs.com/qiuxirufeng/p/9850891.html

时间: 2024-10-10 16:04:46

Learning-Python【26】:反射及内置方法的相关文章

Python学习【第14篇】:面向对象之反射以及内置方法

面向对象之反射及内置方法 一.静态方法(staticmethod)和类方法(classmethod) 类方法:有个默认参数cls,并且可以直接用类名去调用,可以与类属性交互(也就是可以使用类属性) 静态方法:让类里的方法直接被类调用,就像正常调用函数一样 类方法和静态方法的相同点:都可以直接被类调用,不需要实例化 类方法和静态方法的不同点: 类方法必须有一个cls参数表示这个类,可以使用类属性 静态方法不需要参数 绑定方法:分为普通方法和类方法 普通方法:默认有一个self对象传进来,并且只能被

[python] 类常用的内置方法

内置方法 说明 __init__(self,...) 初始化对象,在创建新对象时调用 __del__(self) 释放对象,在对象被删除之前调用 __new__(cls,*args,**kwd) 实例的生成操作 __str__(self) 在使用print语句时被调用 __getitem__(self,key) 获取序列的索引key对应的值,等价于seq[key] __len__(self) 在调用内联函数len()时被调用 __cmp__(stc,dst) 比较两个对象src和dst __ge

python全栈开发【第十七篇】面向对象反射和内置方法

一.静态方法(staticmethod)和类方法(classmethod) 类方法:有个默认参数cls,并且可以直接用类名去调用,可以与类属性交互(也就是可以使用类属性) 静态方法:让类里的方法直接被类调用,就像正常调用函数一样 类方法和静态方法的相同点:都可以直接被类调用,不需要实例化 类方法和静态方法的不同点: 类方法必须有一个cls参数表示这个类,可以使用类属性 静态方法不需要参数 绑定方法:分为普通方法和类方法 普通方法:默认有一个self对象传进来,并且只能被对象调用-------绑定

面向对象之反射及内置方法

一.静态方法(staticmethod)和类方法(classmethod) 类方法:有个默认参数cls,并且可以直接用类名去调用,可以与类属性交互(也就是可以使用类属性) 静态方法:让类里的方法直接被类调用,就像正常调用函数一样 类方法和静态方法的相同点:都可以直接被类调用,不需要实例化 类方法和静态方法的不同点: 类方法必须有一个cls参数表示这个类,可以使用类属性 静态方法不需要参数 绑定方法:分为普通方法和类方法 普通方法:默认有一个self对象传进来,并且只能被对象调用-------绑定

day27 反射、内置方法

一.isinstance和issubclass class Foo: pass class Son(Foo): pass s = Son() #判断一个对象是不是这个类的对象,传两个参数(对象,类) # print(isinstance(s,Son)) # print(isinstance(s,Foo)) # print(type(s) is Son) # print(type(s) is Foo) #判断一个类是不是另一类的子类,传两个参数(子类,父类) print(issubclass(So

Python 教程——String的内置方法

Python为String类型提供了很多很有用的内置方法,这篇文章主要针对Python2.7的内置方法做一个测试列举,展示一下用途. 如果大家想看原版的,可以去这个网址看(https://docs.python.org/2/library/stdtypes.html#string-methods),但是这里是我自己的实践以及一些理解. 1. str.capitalize() 返回第一个字母大写的str str = "a string" str.capitalize()'A string

面向对象:反射、内置方法

反射:通过字符串映射到对象或者类的属性 反射的方法: class People: country = "China" def __init__(self,name,age): self.name = name self.age = age def talk(self): print("%s is talking" % self.name) obj = People("neo",22) """ 判断是否拥有某个属性:

面向对象进阶:反射以及内置方法

一.反射 反射:使用字符串数据类型的变量名来获取这个变量的值 input:用户输入的如果是a,那么打印1.如果输入的是b那么就打印2.如果输入name,那么打印alex 文件:从文件中读出的字符串,想转换成变量的名字 网络:将网络传输的字符串转换成变量的名字 1.反射类中的变量:静态属性,类方法 # class Foo: # School = 'oldboy' # Country = 'China' # language = 'Chinese' # @classmethod # def clas

面向对象-反射-其他内置方法

1.反射 1.1反射含义 通过字符串的形式操作对象的相关属性.方法有hasattr,getattr,delattr #!/usr/bin/env python # -*- coding:utf-8 -*- # Author: vita class People: country='China' def __init__(self,name,age): self.name=name self.age=age def talk(self): print('%s is talking' %self.n