面向对象3--类的特殊成员、反射

什么时候适用面向对象?

  • 如果多个函数须传入多个共同的参数时
  • 根据一个模板创建某些东西
  • (ssh)

类的特殊成员

1. __doc__ #输出:类的描述信息

2. __module__ 和 __class__
  __module__ 表示当前操作的对象在那个模块
  __class__ 表示当前操作的对象的类是什么

3. __init__
  构造方法,通过类创建对象时,自动触发执行。

4. __del__
  析构方法,当对象在内存中被释放时,自动触发执行。

5. __call__
  对象后面加括号,触发执行。即: 对象() 或 类()()

class Foo:
    def __init__(self):
        pass

    def __call__(self, *args, **kwargs):
        print('__call__')


obj = Foo()  # 执行 __init__
obj()  # 执行 __call__

6. __dict__ 类或对象中的所有成员

7. __str__
  如果一个类中定义了__str__方法,那么在打印 对象 时,默认输出该方法的返回值。

8. __getitem__ __setitem__ __delitem__
  类似字典一样索引的操作,以上分别表示获取,设置,删除。(当在类外面做了这些操作后触发这些函数,甚至可删除不存在的数据)

class Foo(object):
    def __getitem__(self, key):
        print('__getitem__',key)
    def __setitem__(self, key, value):
        print('__setitem__',key,value)
    def __delitem__(self, key):
        print('__delitem__',key)

obj = Foo()

result = obj["k1"]          # 自动触发执行 __getitem__
obj['k2'] = 'wupeiqi'      # 自动触发执行 __setitem__
del obj['k1']              # 自动触发执行 __delitem__

__getitem__ k1
__setitem__ k2 wupeiqi
__delitem__ k1

9. __new__ 用来将类实例化的

def __new__(cls,*args,**kwargs):   #重构__new__方法:在实例化之前做些事情
    print("Foo --new--")
    return object.__new__(cls)     #继承父类的__new__方法(此时cls是一个对象)

反射(用户交互)

hasattr(obj,name_str) 判断一个对象obj中是否有对应的name_str字符串方法,返回布尔值
getattr(obj,name_str) 根据字符串去获取obj对象里的对应方法的内存地址
setattr(d,name_str,[new]) 给对象的属性\方法重新定义,若不存在,先创建再赋值。

class Dog(object):
    def __init__(self,name):
        self.name = name
    def eat(self,food):
        print("%s is eating %s" %(self.name,food))

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

d = Dog("xiaohei")
choice = input(">>: ").strip()
if hasattr(d,choice):
    func = getattr(d,choice)
    func("xiaoqiang")
else:
    # setattr(d,choice,"black")     #--1--  设置变量
    # v = getattr(d,choice)
    # print(v)
    setattr(d,choice,bulk)       #--2--  设置方法
    bulk(d.name)

你可能感兴趣的:(面向对象3--类的特殊成员、反射)