python:类的特殊成员方法与反射

#!usr/bin/env python
# -*- coding:utf-8 -*-

__author__ = "Samson"

class Foo:
'''描述类的信息'''
country = "China"
def __init__(self,name):
self.name = name

def func(self):
pass

def __call__(self, *args, **kwargs):
print("running all",args,kwargs)

def __str__(self):#当实例过多时,可以确定是哪个实例
return "obj:%s" %self.name
#__getitem__,__setitem__,__delitem__用于索引操作,如字典。分别表示获取、设置、删除数据
def __getitem__(self, key):
print("__getitem__",key)

def __setitem__(self, key, value):
print("__getitem__",key,value)

def __delitem__(self, key):
print("__delitem__",key)
print(Foo.__doc__)#__doc__表示类的描述信息
obj = Foo("samson")
print(obj.__module__,obj.__class__)#__module__表示当前操作的对象在哪个模块,__class__表示当前操作对象的类是什么
obj()#执行__call__
print(obj.__dict__)#打印类里的所有属性,不包括实例属性
print(Foo.__dict__)#打印所有实例属性,不包括类属性
print(obj)
result = obj["k1"]#自动触发执行__getitem__
obj["k2"] = "samson"#自动触发执行__setitem__
del obj["k1"]#自动触发执行__delitem__


#另外一种类的高B格写法,一切皆对象
def __init__(self,name,age):
self.name = name
self.age = age

def func(self):
print("B格够高吗")

Zoo = type("Zoo",(object,),{"talk":func,"__init__":__init__})#第二个参数继承的父类,第三个为类的成员方法
f = Zoo("samson",20)
f.talk()

#!usr/bin/env python
# -*- coding:utf-8 -*-

__author__ = "Samson"

class MyType(type):
def __init__(self, what, bases = None, dict = None):
print("--MyType init--")
super(MyType,self).__init__(what,bases,dict)

def __call__(self, *args, **kwargs):
print("--MyType call--")
obj = self.__new__(self, *args, **kwargs)#调用Foo中__new__方法
self.__init__(obj, *args,**kwargs)#调用Foo中__init__方法

class Foo(object):
__metaclass__ = MyType#python3没变化,python2中会优先执行MyType中的__init__,__call__,之后是本类中__new__,__init__

def __init__(self, name):
self.name = name
print("Foo --init--")

def __new__(cls, *args, **kwargs):#用来创建实例的,真正实例化时会先于__init__执行
print("Foo --new--")
return object.__new__(cls)#继承父类的__init__方法

# 第一阶段:解释器从上到下执行代码创建Foo类
#第二阶段:通过Foo类创建obj对象
obj= Foo("Samson")


#!usr/bin/env python
# -*- coding:utf-8 -*-

__author__ = "Samson"

def bulk(self):
print("%s is yelling..." %self.name)

class Dog(object):
def __init__(self, name):
self.name = name

def eat(self,food):
print("%s is eating..." %self.name,food)

d = Dog("wangcai")
choice = input(">>:").strip()

if hasattr(d,choice):
func = getattr(d,choice)
delattr(d,choice)#删除对象中的方法与属性
func("binggan")

else:
setattr(d,choice,bulk)#可以装配方法、属性
setattr(d,"age",22)#装配属性
d.talk(d)
print(getattr(d,"age"))

#hasattr(obj,name_str)#判断一个对象obj里是否有对应的name_str字符串的方法
#getattr(obj,name_str)#根据字符串去获取obj对象里的对应的方法的内存地址


posted @ 2018-01-11 22:29  CanSun  阅读(172)  评论(0编辑  收藏  举报