类:描述一类事物的共同特征,是一种抽象的概念
对象:类的具体实现
实例化:通过类创建一个具体的实例
过程:实例化的对象在调用自己的数据属性,然后通过类调用类的函数属性,如果不是使用.的调用方式,打印的是变量是全局定义的变量,非对象的属性
例题如下:
class Dog:#D大写
name='类' def __init__(self,name,action):#每次初始化实例的时候都会执行 self.name=name self.action=action def pinnt_info(self): print('一条狗叫%s' %(self.name)) def action_info(self): print('%s正在%s' %(self.name,self.action)) dog=Dog('哈士奇','玩耍') #实例化一条狗的对象 print(dog.name) #调用函数的数据属性 print(dog.action_info()) #调用对象的函数属性 print(dog.__dict__) #查看类或者对象的属性字典
类的增删改查:#实例属性的增删改查和类相同,只不过作用域是实例属性自身,非类的属性
增:Dog.name1 = '其他值'
查:Dog.name '类'
改:Dog.name = '其他值'
删:del Dog.name
class Dog:#D大写 name='类' def __init__(self,name,action):#每次初始化实例的时候都会执行 self.name=name self.action=action def pinnt_info(self): print('一条狗叫%s' %(self.name))
@property#定义以下函数为静态属性 def action_info(self): print('%s正在%s' %(self.name,self.action))
@classmethod#d定义类的方法,可以调用类方法,不可以调用对象的方法
def action_info(cls,a):
print('%s在这%s' %(cls.name,a))
@staticmethod#类静态方法,只是类的工具包,无法调用类和对象的属性
def test(a):
print('a')
dog=Dog('哈士奇','玩耍')#先实例化对象
静态属性的调用变得简单:
直接dog.action_info就可以调用函数属性,相当于把函数属性变成了数据属性
类的组合:
class Hel: a = "测试" class Test: def __init__(self,name): self.name=name self.hel=Hel() ha = Hel()#实例化 p=Test('laowang')#实例化 print(p.hel.a)#待用组合类的属性
类的继承和派生:
子类继承父类的方法叫做继承,可以继承多个类
子类自己定义的方法叫派生
类调用方法先从自己的属性中寻找,找不到再从父类中查找
继承顺序:
python2.7:经典类 没有基类,继承从左向右一直到找不到,然后从第二个类开始找
python2.7:新式类通python3一样,从左向右一直找到基类,找不到再找下一个
用途1:多个类使用相同的方法可以将改方法提出来做基类
用途2:接口继承作为归一设计
class Dad: '父类' money=10 def __init__(self,name): self.name=name def hit_son(self): print('来自爸爸的方法' ) class Son(Dad): money = 100 def __init__(self,name,age): self.name=name self.age=age def hit_son(self): print('来自儿子的方法')
接口继承:
import abc class All_file(metaclass=abc.ABCMeta): @abc.abstractmethod def read(self): pass @abc.abstractmethod def write(self): pass class Disk(All_file): def read(self): print('disk read') # def write(self): # print('disk write')
如果接口继承没有定义基类的方法那么会报错(提示无法实力化对象)
TypeError: Can't instantiate abstract class Disk with abstract methods write
子类调用父类方法:
class Vehicle1: Country='China' def __init__(self,name,speed,load,power): self.name=name self.speed=speed self.load=load self.power=power def run(self): print('开动啦') print('开动啦') class Subway(Vehicle1): def __init__(self,name,speed,load,power,line): # Vehicle.__init__(self,name,speed,load,power)#不使用super函数进行调用 # super().__init__(name,speed,load,power) #super(__class__,self).__init__(name,speed,load,power) super(Subway,self).__init__(name,speed,load,power)#功能和上面的一样,相当于初始化父类的对象,好处是不管父类如何改动,不会影响子类的调用 self.line=line def show_info(self): print(self.name,self.speed,self.load,self.power,self.line) def run(self): # Vehicle.run(self) super().run()#直接调用父类的方法 print('%s %s 线,开动啦' %(self.name,self.line)) line13=Subway('地铁','1km/s',100,'电',13) line13.show_info() line13.run()