Python基础19 面向对象(2)静态、组合、继承

文章目录

  • 一、静态
    • 1、静态属性 @property
    • 2、类方法 @classmethod
    • 3、静态方法(类的工具包) @staticmethod
  • 二、组合
  • 三、继承
    • 1、子类可以继承父类的属性
    • 2、子类属性调用
    • 3、派生
    • 4、继承的作用
    • 5、继承顺序
    • 6、在子类中调用父类方法:用**super()** 方法

一、静态

1、静态属性 @property

静态属性实际上就是数据属性。
用 @property 修饰,对象在调用类的方法的时候,可以不用加小括号,就像调用数据属性一样。

2、类方法 @classmethod

不跟任何实例捆绑,只跟类捆绑。
用 @classmethod 修饰,类在调用类的方法时,自动向该方法的第一个参数传递类本身。

3、静态方法(类的工具包) @staticmethod

不与类绑定,也不与实例绑定。
用 @staticmethod 修饰,实例或类调用该方法,不自动传值。

class Cal:
    '计算公式'
    def __init__(self,a,b):
        self.a = a
        self.b = b
    @property
    def add(self):
        return self.a + self.b
    @classmethod
    def doc(cls):
        return cls.__doc__

    @staticmethod
    def sub(x,y):
        return x-y

n1 = Cal(4,2)
print(n1.add)   # 6

print(Cal.doc())    # 计算公式

print(n1.sub(5,2))  # 3
print(Cal.sub(7,2)) # 5

二、组合

组合就是由一些小类组合成一个大类。
组合的作用是将类与类进行关联。

class School:
    def __init__(self,sname,st):
        self.sname = sname
        self.student = st

class Student:
    def __init__(self,name):
        self.name = name

p1 = Student("CRTao")
s1 = School("BJTU",p1)
print(s1.student.name)  # CRTao

三、继承

1、子类可以继承父类的属性

python中的继承分为单继承和多继承。

class ParentClass1:
    pass

class ParentClass2:
    pass

#单继承
class SubClass(ParentClass1):
    pass

#多继承
class SubClass(ParentClass1,ParentClass2):
    pass

2、子类属性调用

先查询子类的属性字典,查不到再查父类的属性字典。

class Dad:
    '这个是爸爸类'
    money=10
    name="dad"
    def __init__(self):
        pass

class Son(Dad):
    money = 20
    def __init__(self):
        pass
print(Son.money,Son.name)   # 20 dad
s1 = Son()
print(s1.money,s1.name)   # 20 dad

3、派生

由继承,又引出派生的概念。派生就是子类由父类,又衍生出新的特性,但不会改变父类的属性。

4、继承的作用

①代码重用。但由于类之间需要去耦合,所以这种功能并不常用。
②接口继承,进行归一化设计。这种比较常用。即定义一个接口类,作为基类,子类继承于该基类,并实现接口中定义的方法。

import abc
class AllFile(metaclass=abc.ABCMeta):   #定义接口类
    @abc.abstractmethod     # 指定的接口类方法
    def read(self):
        pass
    @abc.abstractmethod     # 指定的接口类方法
    def write(self):
        pass

class Cdrom(AllFile):
    def read(self):
        print('cdrom read')

    def write(self):
        print('cdrom write')

m1=Cdrom()  # 如果子类没定义接口类指定的方法,实例化时会报错

5、继承顺序

在Python 3 中,多继承时,继承顺序采用广度优先遍历父类。
另外,可以通过MRO列表进行查询继承顺序。即:
类名.__mro__

6、在子类中调用父类方法:用super() 方法

class Vehicle():
    def __init__(self,name):
        self.name = name
    def run(self):
        print("vehicle running!")

class Subway(Vehicle):
    def __init__(self,name,speed):
        super().__init__(name)
        self.speed = speed
    def run(self):
        super().run()
        print("%s speed is %s" %(self.name,self.speed))

s1 = Subway("line 1","120")
s1.run()
'''
vehicle running!
line 1 speed is 120
'''

你可能感兴趣的:(python基础,python,开发语言)