Day23

1、内置函数补充

isinstance判断一个对象和一个类有没有血缘关系

class B:pass
class A(B):pass
a = A()
print(isinstance(a,A))
print(isinstance(a,B))  # 能够检测到继承关系
print(type(a) is A)
print(type(a) is B)     # type只单纯的判断类
View Code

issubclass(子类名,父类名) 如果返回True 说明有继承关系

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))
View Code

2、反射

反射
正常情况下如果可以拿到这个变量 那么如有有这个变量的字符串形式 就是用反射可以获取到这个值
使用字符串数据类型的变量名 访问一个命名空间中的名字
找一个属性 ,直接就可以找到这个属性的值
找一个方法 ,找到的是这个方法的内存地址
hasattr() 判断一个命名空间中有没有这个名字
getattr() 从命名空间中获取这个名字对应的值

反射 4个内置函数
getattr ******
hasattr ******
setattr # 修改和新建 **
delattr # 删除一个属性 *

role = 123
print(eval('role'))
class A:
    role = 'Person'
    def func(self):
        print('*'*self)
# ret = input('>>>')
# print(A.__dict__[ret])
# getattr
print(getattr(A,'role'))     # 从A的命名空间里找一个属性 ,直接就可以找到这个属性的值
f = getattr(A,'func');f(1)   # 从A的命名空间里找一个方法 ,找到的是这个方法的内存地址
getattr(A,'func')(1)
A.func(1)
View Code
# getattr从A的命名空间里找一个属性 ,属性不存在会报错
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)) 
if hasattr(A,ret):
    func = getattr(A,ret)
    func(1)

类使用类命名空间中的名字

getattr(类名,'名字')

对象使用对象能用的方法和属性

getattr(对象名,'名字')

模块使用模块中的名字

导入模块
getattr(模块名,'名字')

import os ; getattr(os,'rename')('user','user_info')

从自己所在的模块中使用自己名字

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

什么.什么
import time # 一个py文件就是一个模块
time.time()
print(time.time())
print(getattr(time,'time')())

import os
os.rename('userinfo','user')
getattr(os,'rename')('user','user_info')

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)()
View Code
#增删改 对象属性
class A:
    def __init__(self,name):
        self.name = name

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

a = A('alex')
a.name
a.wahaha()
getattr(a,'name')
# a 'age' = 18
# a.age = 18
print(a.__dict__)
setattr(a,'age',18)   # 给a对象新增一个属性
print(a.__dict__)
setattr(a,'name','egon')
print(a.__dict__)

# del a.age
delattr(a,'age')
print(a.__dict__)
View Code
#增删改 方法
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)
View Code

3、内置方法

class A:
    def __init__(self,name,age,sex,cls):
        self.name = name
        self.age = age
        self.sex = sex
        self.cls = cls
    def __len__(self):
        return len(self.__dict__)

# 有一个内置函数 和内置方法len()是唯一对应的关系
a1 = A('alex',81,'不详',2)
a1.hobby = '烫头'
a2 = A('egon',20,'不详',3)
a3 = A('yuan',21,'不详',4)
print(len(a1))
print(len(a2))
print(len(a3))
l = list([1,2,3,4,5])
print(l)
print(len(l))
View Code

内置的东西

都和内置的方法有着千丝万缕的联系

字典的存储

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))
View Code

 

posted @ 2018-04-18 16:13  Gentleman王  阅读(92)  评论(0编辑  收藏  举报