什么时候适用面向对象?
- 如果多个函数须传入多个共同的参数时
- 根据一个模板创建某些东西
- (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)