面向对象进阶


class A: def func1(self):pass #对象与方法之间的绑定 def func4(self):pass #对象与方法之间的绑定 @classmethod def func2(cls):pass #类与方法之间的绑定 @staticmethod def func3():pass

print(A.func1)
print(a.func1)

print(b.func1)

  

类方法 由于不适用于对象内存空间中的属性,所以不会将对象和方法绑在一起

而是将类和方法绑在一起

python处处皆对象

class B:
    pass

b1 = B()
b2 = b1
print(b1)

  

 

二,内置函数

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,说明有继承关系

三,反射
# 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)

 

反射

正常情况下如果可以拿到这个变量 那么如有有这个变量的字符串形式 就是用反射可以获取到这个值

使用字符串数据类型的变量名 访问一个命名空间中的名字

找一个属性,直接就可以找到这个属性的值

找一个方法,找到的是这个方法的内存地址

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

getattr() 从命名空间中获取这个名字对应的值

 

类中的反射

  类可以获取类中的属性和方法

 

class A:
    role = 'Person'
    def func(self):
        print('*'*self)

print(hasattr(A,'r'))
print(hasattr(A,'role'))
print(hasattr(A,'func'))

  执行输出:

 

 

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的命名空间里找一个属性 ,属性不存在会报错
else:
    print('filed')
    

class A:
    role = 'Person'
    def __init__(self):
        self.money = 500
    def func(self):
        print('*'*10)

a = A()
print(a.func)
getattr(a,'func')()

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

# 类使用类命名空间中的名字
# 对象使用对象能用的方法和属性
# 模块使用模块中的名字
# import os ; getattr(os,'rename')('user','user_info')
# 从自己所在的模块中使用自己名字

 

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

类使用命名空间中的名字

  getattr(类名,'名字')

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

  getattr(对象名,’名字‘)

模块使用模块中的名字

  导入模块

  getattr(模块名,'名字')

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

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

  import sys

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

getattr 一定要和hasattr配合使用

反射 4个内置函数

getattr    ******

hasattr      ******

setattr  #修改和新建  **

delattr       #删除一个属性    *

 

#增删改   对象属性

#增删改   对象属性
class A:
    def __init__(self,name):
        self.name = name

    def wahaha(self):
        print('wahahahaha')
a = A('alex')
# a.name
a.wahaha()
print(a.__dict__)
setattr(a,'age',18)
print(a.__dict__)

  

#增删改   对象属性
class A:
    def __init__(self,name):
        self.name = name

    def wahaha(self):
        print('wahahahaha')
a = A('alex')
# a.name
a.wahaha()
print(a.__dict__)
setattr(a,'age',18)
print(a.__dict__)
setattr(a,'name','egon')   ####给a对象添加一个属性
print(a.__dict__)

  

#增删改   对象属性
class A:
    def __init__(self,name):
        self.name = name

    def wahaha(self):
        print('wahahahaha')
a = A('alex')
# a.name
a.wahaha()
print(a.__dict__)
setattr(a,'age',18)
print(a.__dict__)
setattr(a,'name','egon')   ####给a对象添加一个属性
print(a.__dict__)

#del a.age
delattr(a,'age')
print(a.__dict__)

  

 

 

  

  

 

posted @ 2018-04-18 17:33  John966  阅读(118)  评论(0编辑  收藏  举报