面向对象

  • 1.面向对象的三大特征
  • 2.多态
  • 3.类属性和实例属性
  • 3 .1类属性
  • 3.1.1设置和访问类属性
  • 3.1.2修改类属性
  • 3.2实例属性
  • 4.类方法和静态方法
  • 4.1类方法
  • 4.1.1类方法的特点
  • 4.1.2类方法的使用场景
  • 4.2静态方法
  • 4.2.1静态方法的特点
  • 4.2.2静态方法的使用场景


1.面向对象的三大特征

封装
将属性和⽅法书写到类的⾥⾯的操作即为封装
封装可以为属性和⽅法添加私有权限

继承
⼦类默认继承⽗类的所有属性和⽅法
⼦类可以重写⽗类属性和⽅法

多态
多态传⼊不同的对象,产⽣不同的结果

2.多态

多态指的是一种使用对象的方式,子类重写父类方法,为此,在调用不同的子类对象的相同方法,可以产生不同的结果 (这样就实现了代码的多样性以及缩减重复代码的书写量)

优点: 调用更加灵活,有了多更加容易写出通用的代码,更加通用的编程可以适应需求的不断变化

示例:

class Dog(object):#此时定义的是一个大类:狗类
    def work(self):
        print('指哪打哪。。。。')

class ArmyDog(Dog):#此时定义的是一个类为战斗犬类
    def work(self):
        print('追击敌人')

class DrugDog(Dog):#此时定义的一个类为缉毒犬类
    def work(self):
        print('追缉毒品')

class Police(object):#此时定义的类为警察类
    def work_with_dog(self,dog):#此时定义的方法是,警察和狗的协作
        dog.work()


dog_drug=DrugDog()
dog_army=ArmyDog()
police1=Police()
police1.work_with_dog(dog_drug)
police1.work_with_dog(dog_army)

运行结果:

多态的实现过程:

1)定义父类

2)定义子类对象,继承父类的方法,并重写父类的方法

3)传递子类对象给调用者,此时可以看到不同的子类可以实现不同的执行效果

示例:

3.类属性和实例属性

3 .1类属性

类属性就是 类对象 所拥有的属性,它被 该类的所有实例对象 所共有

类属性可以使⽤ 类对象 或 实例对象 访问

示例:

class ArmyDog(object):#此时定义的是一个类为战斗犬类
    func='攻击敌人'#此时定义的是类属性,此时可以使用类直接访问还可以是直接使用对象去访问
    def work(self):
        print('帮助警察追击敌人')

print(ArmyDog.func)#用类访问,输出为:攻击敌人

armydog1=ArmyDog()

print(armydog1.func)#用对象去访问,输出为:攻击敌人

注意事项:
类属性的优点记录的某项数据 始终保持⼀致时,则定义类属性。
实例属性 要求 每个对象 为其 单独开辟⼀份内存空间 来记录数据,⽽ 类属性 为全类所共有,仅占⽤⼀份内存,更加节省内存空间

3.1.1设置和访问类属性

类属性只能通过类对象修改,不能通过实例对象修改,如果通过实例对象修改类属性,表示的是创建了⼀个实例属性

示例:

class ArmyDog(object):#此时定义的是一个类为战斗犬类
    func='攻击敌人'#此时定义的是类属性,此时可以使用类直接访问还可以是直接使用对象去访问
    def work(self):
        print('帮助警察追击敌人')

print(ArmyDog.func)#用类访问,输出为:攻击敌人

armydog1=ArmyDog()
armydog2=ArmyDog()

print(armydog1.func)#用对象去访问输出为:攻击敌人
print(armydog2.func)#用对象去访问输出为:攻击敌人

3.1.2修改类属性

class ArmyDog(object):#此时定义的是一个类为战斗犬类
    func='攻击敌人'#此时定义的是类属性,此时可以使用类直接访问还可以是直接使用对象去访问
    def work(self):
        print('帮助警察追击敌人')

print(ArmyDog.func)#用类访问,输出为:攻击敌人

armydog1=ArmyDog()
armydog2=ArmyDog()

print(armydog1.func)#用对象去访问输出为:攻击敌人
print(armydog2.func)#用对象去访问输出为:攻击敌人


#如果是需要修改类属性,只能是使用类访问并修改类属性,此时对象去修改类属性只是添加了一个实例属性,没有改变类属性的值
ArmyDog.func='搜查毒品'
print(armydog1.func)#用对象去访问输出为:搜查毒品
print(armydog2.func)#用对象去访问输出为:搜查毒品
armydog2.func='这是用实例对象去修改'
print(armydog2.func)#此时修改相当于是创建了新的实例对象输出为:这是实例对象去修改
print(armydog1.func)#此时修改并为改变类里面的属性,只是在实例对象armydog2中的修改的输出为:搜查毒品

3.2实例属性

class Dog(object):
    def __init__(self):
        self.name='金毛'
    def print_info(self):
        print(f'这只狗的名字是{self.name}')


dog1=Dog()
print(dog1.name)#金毛
#print(Dog.name)实例对象不能通过类访问

注意事项:实例属性,是定义在__Init__中的属性,是不可以用类进行访问的,只能是用实例对象进行访问

4.类方法和静态方法

4.1类方法

4.1.1类方法的特点

需要⽤装饰器@classmethod来标识其为类⽅法,对于类⽅法,第⼀个参数必须是类对象,⼀般以cls作为第⼀个参数

4.1.2类方法的使用场景

使用场景:当方法中需要使用类对象(如访问私有属性)时,定义类方法

类方法一般和类属性配合使用

4.2静态方法

示例:

class Dog(object):
    __name='金毛'

    @classmethod
    def get_name(cls):
        return cls.__name
    @classmethod
    def set_name(cls,name):
        cls.__name=name

dog1=Dog()
print(dog1.get_name())#金毛
dog1.set_name('二哈')
print(dog1.get_name())#二哈

4.2.1静态方法的特点

需要通过装饰器@staticmethod来进⾏修饰,静态⽅法既不需要传递类对象也不需要传递实例对象(形参没有self/cls)。静态⽅法 也能够通过 实例对象 和 类对象 去访问

4.2.2静态方法的使用场景

当⽅法中 既不需要使⽤实例对象(如实例对象,实例属性),也不需要使⽤类对象 (如类属性、类⽅法、创建实例等)时,定义静态⽅法取消不需要的参数传递,有利于 减少不必要的内存占⽤和性能消耗

示例:

class Dog(object):
    __name='金毛'

    @classmethod#这是类方法
    def get_name(cls):
        return cls.__name
    @classmethod#这是类方法
    def set_name(cls,name):
        cls.__name=name

    @staticmethod   #只是静态方法,没有参数(类属性和实例属性时)
    def print_func():
        print('这是一个狗类')

dog1=Dog()
dog1.print_func()#输出为:这是一个狗类