面向对象的编程进阶
静态方法
加上staticmethod后这个函数虽然还在类里,但已经和类没有关系了,也不需要再调用self
直接d = Dog("chenronghua")
d.eat(d)
举例:
class Dog(object):
def __init__(self, name, ):
self.name = name
@staticmethod#此时会报错缺少self
def eat(self):
print ("%s is eating"%(self.name))
d = Dog("陈荣华")
d.eat()
TypeError: eat() missing 1 required positional argument: ‘self‘
类方法
属性方法
把一个方法变成一个静态属性
class Dog(object):
def __init__(self, name, ):
self.name = name
@property #attribute
def eat(self):
print ("%s is eating"%self.name)
d = Dog("chenronghua")
d.eat
类的特殊成员方法
__doc__
#直接打印这个类的描述
class Foo(object):
"""这个类是描述狗这个对象"""
print (Foo.__doc__)
__module__和__class__
__module__表示当前操作的对象在那个模块
__class__ 表示当前的对象的类是什么
__call__对象后面加括号,触发执行
class Dog(object):
def __cal__(self, *args, *kwargs)
d = Dog("chenronghua")
d(1,2,3,name="3333")
__dict__
打印类里的属性
class Dog(object):
def __cal__(self, *args, *kwargs)
d = Dog("chenronghua")
d(1,2,3,name="3333")
#打印类里的属性
print Dog.__dict__
#打印d里的方法
print d.__dict__
反射
hasattr(obj,name_str)
getattr(obj_name_str)
class Dog(object):
def __init__(self, name):
self.name = name
def eat(self):
print ("%s is eating..."%self.name)
d = Dog("niu")
choice = input(">>:").strip()
if hasattr(d,choice): #判断对象里是否有对应的字符串的方法映射
func = getattr(d,choice) #根据字符串里的对象去获取对应的方法内存地址
func("chenronghua")
def bulk(name):
print ("%s da jiao "%name)
class Dog(object):
def __init__(self, name):
self.name = name
def eat(self,food):
print ("%s eat %s"%(self.name,food))
d = Dog("牛汉阳")
# d.eat("chenronghua")
def bulk(self):
print ("yell %s"%self.name)
choice = input(" >> : " )
if hasattr(d,choice):
print (hasattr(d,choice))
getattr(d,choice)("草")
else:
setattr(d,choice,bulk)
getattr(d,choice)(d)
#func = getattrt(d,choice)
#func(d)
SOCKET
conn,addr = server.accept()
conn是个客户端连接到服务器为其生成的一个实例
addr 是个IP地址和端口