4-18 面向对象的进阶

1,isinstance

判断一个类和另一个类有没有(血缘)关系。type只能检测数据类型

class A:pass
class B(A):pass
a = A()
print(isinstance(a,A))
print(isinstance(a,B))
class A:pass
class B(A):pass
a = A()
print(type(a)is A)
print(type(a)is B)

2,issubclass 检测两个类有没有继承关系

class B:pass
class C(B):pass
class D(C):pass
print(issubclass(C,D))
print(issubclass(D,C))
print(issubclass(B,C))
print(issubclass(C,B))
print(issubclass(D,B))
# issubclass(子类名,父类名) 如果返回True,说明有继承关系

3,最重要的反射

第一种:使用反射得到类的命名空间的名字  getattr()  和  hasattr ()

getattr()  从命名空间空间中得到这个名字对应的值。

hasattr()  判断一个命名空间中有没有这个名字 有True 无Flase

getaatr(类名,'名字')

class A:
    role = 'Person'
    def func(self):
        print('*'*self)
print(hasattr(A,'r'))
print(hasattr(A,'role'))
print(hasattr(A,'func'))
ret = input('>>>')
if hasattr(A,ret):
    print(getattr(A,ret))     # getattr从A的命名空间里找一个属性 ,属性不存在会报错
if hasattr(A,ret):
    func = getattr(A,ret)
    func(1)

第二种:反射得到对象使用的方法和属性

getattr(对象名,'名字')

class Teacher:
    role = 'person'
    def __init__(self,name):
        self.name = name
        self.money = 500
    def func(self):
        print('好好努力')
alex = Teacher('alex')
print(getattr(alex,'name'))
getattr(alex,'func')()

第三种:使用模块中的模块名字

getattr(模块名,'名字')

import os;getattr(os,'rename')('user','user_info')
import time
time.time()
print(time.time())
print(getattr(time,'time')())

第四种:当前自己的模块使用自己的名字

import sys    getattr(sys.modules['__main__'],名字)

def login():
    print('执行login功能')

def register():
    print('执行register功能')

import sys  # 和python解释器相关的内容都在sys里
print(sys.modules['__main__'])
func = input('>>>')
if hasattr(sys.modules['__main__'],func):
    getattr(sys.modules['__main__'],func)()

5,反射的内置函数

getattr,hasattr,setattr,delattr.

getattr()  从命名空间空间中得到这个名字对应的值。

hasattr()  判断一个命名空间中有没有这个名字 有True 无Flase

setattr()  增加和改对象属性和方法

delattr() 删除对象的属性和方法

class A:
    def __init__(self,name):
        self.name = name
    def wahaa(self):
        print('ssdas')
a = A('alex')
a.wahaa()
getattr(a,'name')
# a.age = 18
# print(a.__dict__)
setattr(a,'age',18)
setattr(a,'name','egon')
print(a.__dict__)
delattr(a,'name')
print(a.__dict__)
class A:
    def __init__(self,name):
        self.name = name

    def wahaha(self):
        print('wahahahahaha')

def qqxing(self):
    print('qqqqqxing')

a = A('alex')
# setattr(A,'qqxing',qqxing)
setattr(a,'qqxing',qqxing)
# print(a.__dict__)
a.qqxing(a)

 6,内置方法__len__和__hash__

有一个内置函数和内置方法len()是唯一对应的关系

class A:
    def __init__(self,name,age,sex,hobby):
        self.name = name
        self.age = age
        self.sex = sex
        self.hobby = hobby
    def __len__(self):
        return len(self.__dict__)
alex = A('alex',33,'male','girl')
egon = A('egon',23,'female','抽烟')
alex.money = 200
print(len(alex))

hash方法

class A:
    def __init__(self,name,age,sex,cls):
        self.name = name
        self.age = age
        self.sex = sex
        self.cls = cls
    def __hash__(self):
        return 0
a1 = A('alex',81,'不详',2)
print(hash(a1))
原文地址:https://www.cnblogs.com/yzxing/p/8876359.html