第十二节:面向对象

类:描述一类事物的共同特征,是一种抽象的概念

对象:类的具体实现

实例化:通过类创建一个具体的实例

过程:实例化的对象在调用自己的数据属性,然后通过类调用类的函数属性,如果不是使用.的调用方式,打印的是变量是全局定义的变量,非对象的属性

例题如下:

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()

猜你喜欢

转载自www.cnblogs.com/sxdpython/p/12702143.html