面向对象有3大特征:封装,继承,多态
封装即私有化,将类属性设置为私有,访问范围仅限类中,外界访问和修改通过get和set方法,并且修改属性需要遵循一定的规则class People:
def __init__(self, name, age):
self.name = name
self.__age = age
def get_age(self):
return self.__age
def set_age(self, age):
if (age > 0 and age < 100):
self.__age = age
else:
print('年龄不正确')
p = People('lily', 18)
print(p.get_age())
p.set_age(88)
print(p.get_age())
p.set_age(102)
print(p.get_age())
'运行结果:
18
88
年龄不正确
88
还有一种更简单的方法,使用@property装饰器,将私有变量像没有私有一样使用
class People:
def __init__(self, name, age):
self.name = name
self.__age = age
@property
def age(self):
return self.__age
@age.setter
def age(self,age):
if (age > 0 and age < 100):
self.__age=age
else:
print('年龄不正确')
def study(self):
print('{},年龄{},正在学习'.format(self.name,self.__age))
p = People('lily', 18)
print(p.age)
p.age=88
print(p.age)
p.age=102
print(p.age)
'运行结果:
18
88
年龄不正确
88
继承,分为两种,has a和is a,现在继承一般指的是is aimport random
class Road:
def __init__(self, name, len):
self.name = name
self.len = len
class Car:
def __init__(self, brand, speed):
self.brand = brand
self.speed = speed
def get_time(self, rode):
ran_time = random.randint(1, 10)
print('{}品牌的车在{}上以每小时{}公里的速度跑了{}小时'.format(self.brand, rode, self.speed, ran_time))
c = Car('福特', 30)
r = Road('深南大道', 50000)
c.get_time(r.name)
'运行结果:
福特品牌的车在深南大道上以每小时30公里的速度跑了5小时
'''
特点:
1.如果类中不定义init,系统直接调用父类的init
2.如果类定义了自己的init,需要在当前类的init中调用父类。方法:super().__init__(参数),super(类名,self).__init__(参数)
3.如果父类和子类有同名的方法,默认首先搜索子类
使用场景:父类提供的方法不能满足子类的需求,就需要在子类中定义一个同名的方法,即重写方法
'''
class Pet():
def __init__(self, nickname):
print('----父类init-----')
self.nickname = nickname
def eat(self):
print('宠物喜欢吃')
class Cat(Pet):
def catch(self):
print('{}喜欢抓老鼠'.format(self.nickname))
class Dog(Pet):
def __init__(self, nickname,color):
super(Dog, self).__init__(nickname)
print('-----子类init-----')
self.color = color
def watch_door(self):
print('{}擅长看门'.format(self.nickname))
class Bird(Pet):
def __init__(self, nickname, color):
super().__init__(nickname)
self.color = color
def eat(self, food):
print('{}喜欢吃{}'.format(self.nickname, food))
cat = Cat('花花')
cat.catch()
dog = Dog('大黄', 'yellow')
dog.watch_door()
bird = Bird('麻雀', 'black')
bird.eat('虫子')
'运行结果:
----父类init-----
花花喜欢抓老鼠
----父类init-----
-----子类init-----
大黄擅长看门
----父类init-----
麻雀喜欢吃虫子
多态,python没有严格意义上的多态,需要借助isinstance来实现多态'''
python没有严格意义上的多态,严格意义上的多态是设置一个pet类型就只能传pet类型的对象
但是python同时却可以接收其他类型的对象,只能借助isinstance来实现多态
'''
class People():
def __init__(self,name):
self.name=name
def feed(self,pet):
if isinstance(pet,Pet):
print('{}喜欢养宠物:{}'.format(self.name,pet.nickname))
else:
print('太危险了!')
class Pet():
def __init__(self,nickname):
self.nickname=nickname
class Cat(Pet):
role='猫'
def catch(self):
print('{}喜欢抓老鼠'.format(self.nickname))
class Tiger():
def eat(self):
print('老虎不是宠物')
cat=Cat('花花')
tiger=Tiger()
people=People('小丸子')
people.feed(cat)
people.feed(tiger)
'运行结果:
小丸子喜欢养宠物:花花
太危险了!
相关知识
Python面向对象高级编程——多重继承
使用面向对象思想设计电子宠物系统
初识面向对象(猫咪项目)
Python实现宠物医院基础功能
Python笔试题
js面向对象第二天
案例驱动式Python学习笔记【第六篇】电子宠物
Python入门笔记—第十章【面向对象之OOP(第四部分,MiXin)】
计算机毕业设计django基于python的宠物分享网站
Python基于大数据技术的宠物商品信息比价及推荐系统
网址: python之面向对象 https://m.mcbbbk.com/newsview201810.html
上一篇: 【中国科学报】AI加持动物行为识 |
下一篇: 来一组比较小众呆萌又... |