2018.10.25

'''
1类中定义函数分为了两大类:
1. 绑定方法
特殊之处: 绑定给谁就应该由谁来调用,谁来调用就会将谁当做第一个参数自动传入

绑定给对象的方法: 在类中定义函数没有被任何装饰器修饰的情况下,默认就是绑定对象的
绑定给类的方法: 为类中定义函数添加一个装饰器classmethod,就是绑定类的

2. 非绑定方法
特殊之处: 非绑定方法就是一个普通函数,既不与类绑定又不与对象绑定,意味着类与对象都可以调用,但是无论谁来调用都是一个普通函数,没有自动传值效果
非绑定方法: 为类中定义函数添加一个装饰器staticmethod,就是非绑定方法

# class Foo:
# def func1(self):
# print('func1',self)
#
# @classmethod
# def func2(cls):
# print('func2',cls)
#
# @staticmethod
# def func3(x,y):
# print('func3',x,y)
#
# obj=Foo()
#一.绑定给对象的方法
# 绑定给对象的,应该由对象来调,
# obj.func1()
# print(obj)

# 绑定给对象的方法,类也可以调用,但是类调用就是一个普通函数,没有自动传值的效果
# print(obj.func1)
# print(Foo.func1)
# Foo.func1(obj)

#二.绑定给类的方法
# 绑定给类的,应该由类来调,
# print(Foo.func2)
# print(obj.func2)
# Foo.func2()
# obj.func2()

#三.非绑定方法
# print(obj.func3)
# print(Foo.func3)

# obj.func3(1,2)
# Foo.func3(1,3)


2反射指的是通过字符串来操作属性
'''
class Foo:
def __init__(self,name,age):
self.name=name
self.age=age

def tell_info(self):
print('%s:%s' %(self.name,self.age))

obj=Foo('egon',18)

#hasattr
# print(hasattr(obj,'name')) #obj.name
# print(hasattr(obj,'tell_info')) #obj.tell_info

#getattr
# res=getattr(obj,'name') #res=obj.name
# print(res)
# res=getattr(obj,'xxx',None)
# print(res)

#setattr
# setattr(obj,'age',38)
# setattr(obj,'sex','male')
# print(obj.__dict__)
# print(obj.sex)

#delattr
# delattr(obj,'name')
if hasattr(obj,'xxxxe'):
delattr(obj,'xxxxe')
# print(obj.__dict__)


# print(isinstance([],list)) #type([]) is list
# class Foo:
# pass
# obj=Foo()
# print(isinstance(obj,Foo))

# issubclass()
# class Foo:
# pass
#
# class Bar(Foo):
# pass
# print(issubclass(Bar,Foo))


# __str__: 会在对象被打印时自动触发,然后将返回值当作打印的结果
class People:
def __init__(self,name,age):
self.name=name
self.age=age

def __str__(self):
return '<%s:%s>' %(self.name,self.age)

peo=People('egon',18)
print(peo) #print(peo.__str__())

l=list([1,2,3])
print(l)

3个内置方法
# print(isinstance([],list)) #type([]) is list
# class Foo:
# pass
# obj=Foo()
# print(isinstance(obj,Foo))

# issubclass()
# class Foo:
# pass
#
# class Bar(Foo):
# pass
# print(issubclass(Bar,Foo))


# __str__: 会在对象被打印时自动触发,然后将返回值当作打印的结果
class People:
def __init__(self,name,age):
self.name=name
self.age=age

def __str__(self):
return '<%s:%s>' %(self.name,self.age)

peo=People('egon',18)
print(peo) #print(peo.__str__())

l=list([1,2,3])
print(l)