类.__init__查看对象的函数属性
类.__dict__查看类的属性对象
定义在类内部的变量,是所有对象共有的,id相同
定义在类内部的函数,是绑定在所有对象上,给对象用的obj.func()就会吧obj传到func(obj)
类内部的方法都是绑定方法,绑定到对象上
绑定方法(类绑定,对象绑定),非绑定方法
面向对象的特性
类与对象
对象是特征(变量)与技能(函数)的结合
类是一系列对象共有的特征和技能
现实中,先有对象,再总结归纳出类,程序中,先定义类再实例化对象
类的第一种用法,实例化
第二种用法,属性引用
继承与多态
继承
“是”的关系,可以用继承来消除代码冗余
人是动物,猪是动物,狗是动物
类的括号写的是被继承的类
继承顺序,在python2中有经典类和新式类,python3中只有新式类,新式类继承顺序
新式类继承顺序:D->C->B->E->F->G->A
继承可以是变量可以是方法,对象本身没有的变量或者方法去父类中找,父类没有去object中找。
组合
也可以解决代码容易,是什么“有”什么的关系
class teacher:
def __init__(self,name,age,year,mon,day):
self.name = name
self.age = age
self.birth1 =
birth(year,mon,day)
class birth:
def __init__(self,year,mon,day):
self.year = year
self.mon = mon
self.day = day
def tell(self):
print("%s-%s-%s"
%(self.year,self.mon,self.day))
t=teacher("dodo",18,1990,8,12)
print(t)#<__main__.teacher
object at 0x00000000006C1DA0>
print(t.name)#dodo
print(t.birth1)#<__main__.birth object at 0x00000000006C1DD8>
t.birth1.tell()#1990-8-12
模拟接口
在类里面定义需要实现的功能,在实例中实现
class File():
#
def read(self):#pass
#
#方法一:主动抛异常,让实例实现read功能
#
raise TypeError("类型错误")#主动抛异常,只有子类重写才不会抛异常
#
#方法二:强行实现功能,抽象类
抽象类
import abc
class File(metaclass = abc.ABCMeta):
@abc.abstractmethod
def read(self): pass
@abc.abstractmethod
def talk(self):pass
class word(File):
def read(self):
print("read")
def talk(self):
print("talk")
p=word()#
多态
同一种事物的多种形态,类的子类。
多态性:具有不同功能的函数可以使用相同的函数名
如:父类的函数,在子类重写
封装
绑定方法和非绑定方法
绑定方法:可以自动传值
只要在类内部定义,没有任何修饰,就是对象的绑定方法,把对象当做第一个参数传入方法
用@classmethod是类绑定方法,把类当做第一个参数传入方法体
非绑定方法
用@staticmethod修饰的类内部的方法就是非绑定方法,就是一个普通工具
"""
绑定方法和非绑定方法
"""
class Foo:
def test1(self):
pass
@classmethod
def test2(cls):
pass
@staticmethod
def test3():
pass
p = Foo()
print(p.test1)
print(Foo.test2)
print(p.test3)
"""
<bound method Foo.test1 of <__main__.Foo object at
0x0000000000AB1D30>>
<bound method Foo.test2 of <class ‘__main__.Foo‘>>
<function Foo.test3 at 0x0000000000AB3598>
"""
反射
通过字符串的方式寻找类中的属性
class people:
country = ‘chinese‘
def __init__(self,name,age):
self.name = name
self.age = age
p = people("egon",10)
查询
# print(hasattr(p,‘name‘))#类中有没有name属性
增加
# setattr(p,‘x‘,123)#设置属性值
# print(p.__dict__)#{‘x‘: 123, ‘age‘: 10, ‘name‘: ‘egon‘}
获取
# print(getattr(p,‘name‘))#egon
# print(getattr(p,‘x‘,"not exist"))#not exist
# #或者
# if hasattr(p,‘x‘):
# res = getattr(p,‘x‘)
# print(res)
删除
print(people.__dict__)#有country
print(p.country)
delattr(people,‘country‘)
print(people.__dict__)#无country