面向对象的进阶---反射--一些内置方法

反射

 反射和一些类的内置方法

  1  isinstance ----  issubclass

type()--判断 是不是

ininstance(object,cls) 判断 是不是类的对象 如果这个类有父类 这个对象也是这个父类的对象
issubclaaa(cls,cls)  判断一个类是不是另一个类的子类

 =============================   反射  =================================

 把一个字符串 类型的变量 变成一个 真实存在这个程序中的变量名,并且能够使用它

  hasattr --  getattr

   People.contry  ===   People.__dict__[‘country‘]  实际上都是 通过字符串 访问 属性                      通过字符串 映射到属性 ---- 反射

 =============================   反射  =================================

======================
 hasattr --  getattr
======================

 ===================xx.xx形式   -----对象.属性-----

 ===   命令   =====

 1 类名 --调 方法 属性

2 对象 -- 调 方法 属性

# class Login:
#     r=‘Persoin‘
#     @staticmethod
#     def register():
#         print(‘regiseter‘)
#     @staticmethod
#     def login():
#         print(‘login‘)
#
# cmd=input(‘>> cmd:‘)
# if hasattr(Login,cmd):
#     getattr(Login,‘login‘)()
# # if hasattr(Login,cmd):
# #     getattr(Login,‘register‘)()


3 模块 调用

# import demo1
# getattr(demo1,‘P‘)()
# print(getattr(demo1,‘p‘))

 4 在自己模块中调用模块方法

# def login():
#     print(‘login‘)
# def register():
#     print(‘register‘)
# cmd=input(‘>>>‘)
# import sys
# getattr(sys.modules[__name__],cmd)

# import sys
# print(sys.modules[__name__])  #防止调用时候改变

  =============================   反射  =================================

 ============================
      setattr -创建一个属性
      delattr -创建一个属性
 ============================

# class Teacher:
#     school=‘Old_boy‘
#     def __init__(self,name,age):
#         self.name=name
#         self.age=age
#     def teach(self):
#         print(‘teacher‘)

# def laugth():
#     print(‘sdasds‘)
#
# alex=Teacher(‘alex‘,29)
# setattr(Teacher,‘school‘,‘OLD_BOY‘) # setattr -创建一个属性
# setattr(Teacher,‘laugth‘,laugth) # setattr -类创建一个j静态方法
# setattr(alex,‘laugth‘,laugth) # setattr -对象创建一个j静态方法
#
# print(hasattr(alex,‘name‘))
# print(getattr(alex,‘name‘))
# getattr(alex,‘teach‘)()
# print(getattr(alex,‘school‘))
# delattr(alex,‘age‘)
# print(Teacher.__dict__)
# print(alex.__dict__)
#

#  =============================   反射  =================================

面向对象高级

    =========================== 面向对象高级 ===============================  内置函数  ---    类的内置方法                  __len__  len(obj)  触发

# class SB:
#     def __init__(self,name,sex):
#         self.name=name
#         self.sex=sex
#     def __len__(self):
#         return len(self.__dict__)
#         pass
# jiangyi=SB(‘jiangyi‘,‘male‘)
# print(jiangyi.__dict__)
# print(len(jiangyi))

                 __str__  __repr__    str() repr() 触发
#
# 都有对应的 str(obj) repr(obj)
# 优先使用----- repr --- str没有的会使用repr

# class Animal:
#     def __init__(self,kind,name):
#         self.kind=kind
#         self.name=name
#     # def __str__(self):
#     #     return ‘str kind: %s name: %s‘%(self.kind,self.name)
#     def __repr__(self):
#         return ‘repr kind: %s name: %s‘ % (self.kind, self.name)
# cat=Animal(‘aelx‘,‘aegon‘)
#
# print(str(cat))
# print(repr(cat))  #
#
# print(‘%s‘%cat)
# print(‘%r‘%cat)
# # print(str([1,2]))

              __del__做一些清理工作           del 触发 ---析构方法

# 绑定给对象的--进行清理工作 默认 在最后执行
# del py ---删除对象

# class Course:
#     def __init__(self,name,price):
#         self.name=name
#         self.price=price
#     def __del__(self):
#         print(‘del 执行!‘)
#
# a=Course(‘a‘,1000)
# print(‘====>>>‘)
# del a

                      __call__  对象 可以执行  () 触发
# class Course:
#     def __init__(self,name,price):
#         self.name=name
#         self.price=price
#     def __call__(self):
#         print(‘ 执行!‘)
#
# a=Course(‘a‘,1000)
# a()

                     __eq__  obj==cat 相等    ==触发

# class Animal:
#     def __init__(self,name,kind):
#         self.name=name
#         self.kind=kind
#     def __eq__(self,obj):
#         if self.name==obj.name and self.kind==obj.kind:
#             return True
#         else:
#             return False
# dog=Animal(‘dog‘,‘dog‘)
# cat=Animal(‘cat‘,‘cat‘)
# print(dog==cat)

         描述符            ======== item系列 相关=========

# li=[1,2,3]
# dic={‘a‘:2}
# print(dic[‘a‘])   类似于字典的 [] 方法

# class Animal:
#     def __init__(self,name,sex):
#         self.sex=sex
#         self.name=name
#     def __getitem__(self,item):
#         getattr(self,item)
#       # self.__dict__[item]
#     def __setitem__(self,key,val):
#         setattr(self,key,val)
#     #  self.__dict__[key]=value
#     def __delitem__(self,key):
#         delattr(self,key)
#        #  self.__dict__.pop(key)

# cat=Animal(‘name‘,‘sex‘)
# print(cat[‘name‘])  # 获取   __getitem__(self,item)  getattr(self,item)
# print(cat[‘sex‘])
# cat[‘age‘]=19       # 修改  __setitem__(self,key,val)  ---  setattr(self,key,val)
# print(cat[‘age‘])
# del cat[‘name‘]     #  删除  __delitem__(self,key)   delattr(self,key)
# print(cat.__dict__)

# ================================

                   __new__ 先执行 创建对象 创建self的
# class Teacher:
#     def __init__(self,name,sex):
#         self.name=name
#         self.sex=sex
#     def __new__(cls,*args,**kwargs):
#         object.__new__(cls,*args,**kwargs)  #默认是从 object 创建 不同的对象
#         return object
# a=Teacher(‘AE‘,‘MALE‘)
# b=Teacher(‘SD‘,‘MALE‘)

==================单例模式 ----始终只有一个对象  它的属性可以随着改变而改变======================

# class Teacher:
#     __isinstance=None
#     def __new__(cls,*args):
#         if not cls.__isinstance:
#             cls.__isinstance=object.__new__(cls) # 执行这个 创建一个对象 没有定义属性
#         return cls.__isinstance  # 控制只返回第一次创建的对象
#     def __init__(self,name,cloth):
#         self.name=name
#         self.cloth=cloth

# Tl=Teacher(‘刘禹锡‘,‘白色‘)
# Tw=Teacher(‘王启帅‘,‘黑色‘)
# print(Tl)
# print(Tw)

==================================================================
例子
# from collections import namedtuple
# Card=namedtuple(‘Card‘,([‘rank‘,‘suits‘]))
#
# class FranchDeck:
#     ranks=[str(n) for n in range(2,11)] + list(‘JQKA‘)
#     suits=[‘红心‘,‘黑桃‘,‘方块‘,‘梅花‘]
#
#     def __init__(self):
#         self.cards=[Card(rank,suits) for rank in FranchDeck.ranks for suits in FranchDeck.suits]
#     def __len__(self):
#         return len(self.cards)
#     def __getitem__(self,item): # 依赖于deck[0]
#         getattr(self,item)
#         return self.cards[item]
#     def __setitem__(self,key,val):# shuffle
#         setattr(self,key,val)
#         self.cards[key]=val
# deck=FranchDeck()
# print(deck[0])
# from random import choice,shuffle
# print(choice(deck))
# shuffle(deck)
# print(choice(deck))

例子
# class Person:
#     def __init__(self,name,age,sex,weight):
#         self.name = name
#         self.sex = sex
#         self.age = age
#         self.weight = weight
#     def __eq__(self,obj):
#         if self.name==obj.name and self.sex==obj.sex:
#             return True
#     def __hash__(self):
#         return hash(str(self.name)+str(self.sex))   #
#     def __str__(self):
#         return ‘name: %s sex: %s‘%(self.name,self.sex)
#     def __len__(self):
#         return len(self.__dict__)
# p_list=[]
# for j in range(0,100):
#     p_list.append(Person(‘alex‘,j,‘male‘,40))
# print(set(p_list))
时间: 2024-07-31 16:54:47

面向对象的进阶---反射--一些内置方法的相关文章

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

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

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

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

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

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

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

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

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

反射:通过字符串映射到对象或者类的属性 反射的方法: 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) """ 判断是否拥有某个属性:

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

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

issubclass和isinstance,反射,内置方法

目录 面向对象进阶 一.issubclass 和 isinstance 1.1 issubclass 1.2 isinstance 二.反射 2.1 什么是反射 2.2 四个可以通过字符串操作对象属性和方法的内置函数 2.2.1 hasattr() 2.2.2 getattr() 2.2.3 setattr() 2.3.4 delattr() 三.内置方法 3.1 __str__和__repr__ 3.2 点拦截方法:__setattr__,__delattr__,__getattr__ 3.3

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

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

反射的概念 可以用字符串的方式去访问对象的属性,调用对象的方法(但是不能去访问方法),Python 中一切皆对象,都可以使用反射. 反射有四种方法: hasattr:hasattr(object, name)判断一个对象是否有 name 属性或者 name 方法.有就返回 True,没有就返回 False getattr:获取对象的属性或者方法,如果存在则打印出来.hasattr 和 getattr 配套使用 需要注意的是,如果返回的是对象的方法,返回出来的是对象的内存地址,如果需要运行这个方法