面向对象
- 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()#输出为:这是一个狗类