python类及三大特性
python三大特性:封装,继承,多态
掌握三大特性:封装(打包属性方法)→ 继承(复用代码)→ 多态(灵活适配)
一、封装:
1、封装:类将属性和方法封装成私有属性和私有方法,使得类外无法直接更改私有属性,也无法调用私有方法,这就是类的封装性。
封装的优点:
(1)封装数据可以很好的保护隐私、
(2)封装方法主要原因是隔离复杂度
(3)封装提高了代码的复用性
(4)隐藏对象的属性和实现细节,提供公共方法对其访问
类的访问权限:
类的属性按访问权限分成:
- 私有(private)属性:只能在类内访问的属性,确保类内属性的安全,命名方式双下划线开头,比如__var,如果在类内部方法中访问私有属性,应该加上self,如self.__var
- 保护(protect)属性:能够被类内和子类访问的属性,命名方式单下划线开头,比如_var。
- 公有(public)属性:能够被类外部访问的属性, 命名方式和普通方式一样字母开头。
方法也有私有方法,命名方式也是双下划线开头,__fun(),如果在类内部访问私有方法,应该加上self,如self.__fun()
下面通过例子来了解类的权限.
class Pople(): def __init__(self,name,Occ = "篮球运动员"): self.__name = name # 私有的实例属性 self.Occ = Occ #实例属性 def __getOcc(self): #私有方法 return self.Occ def setname(self,newname): #实例方法 self.__name = newname def getname(self): #print(f"性别:{self.__getOcc()}") return self.__name def print_info(self): print(f"{self.getname() }是位{self.__getOcc()}") #访问私有方法 if __name__ == "__main__": P = Pople("James") # 绑定到一个实例到对象. print(f"打印出实例属性: {P.Occ}") # 公用属性可以打印 #print(P.__name) #私有属性只能在类内部调用,打印会报错 #P.__getOcc() #私有方法只能内部调用. P.setname('库里') #修改实例方法 #print(P.getname()) P.print_info() # 打印方法
👉 新手注意:
- •
class是关键字,用来定义“类”(对象的模板) - •
__init__是初始化方法,第一个参数永远是self(代表对象本身) - •
self.属性名用来定义对象的属性,只能在对象内部用
二、继承:站在“巨人肩膀”上写代码
继承就是“子对象”继承“父对象”的属性和方法 ,还能自己加新功能,不用重复写父对象的代码。
新类可以继承父类的公用属性和共有方法,但是不能继承父类的私有属性和私有方法.
继承的作用:使得子类能够拥有父类的属性和方法,以达到复用的目的。
#!/usr/bin/env python #coding:utf-8 # 父类:动物(包含所有动物的通用属性和方法) class Animal: def __init__(self, name, age): self.name = name self.age = age def eat(self): print(f"{self.name}在吃饭~") def speak(self): print(f"{self.name}在叫~") # 子类:猫(继承Animal,自动拥有name、age属性和eat方法) class Cat(Animal): # 新增子类特有的属性 def __init__(self, name, age, color): # 调用父类的初始化方法,继承name和age super().__init__(name, age) self.color = color # 猫特有的属性:颜色
# 重写父类的speak方法(自定义猫的叫声) def speak(self): print(f"{self.name}({self.color})喵喵叫~") # 新增猫特有的方法 def catch_mouse(self): print(f"{self.name}抓老鼠啦!") # 子类:狗(继承Animal) class Dog(Animal): def __init__(self, name, age, breed): super().__init__(name, age) self.breed = breed # 狗特有的属性:品种 # 重写父类的speak方法 def speak(self): print(f"{self.name}({self.breed})汪汪叫~") # 狗特有的方法 def shake_tail(self): print(f"{self.name}摇尾巴卖萌~") # 创建子类对象并使用 my_cat = Cat("咪咪", 2, "橘色") my_dog = Dog("旺财", 3, "金毛") my_cat.eat() # 继承父类的方法:咪咪在吃饭~ my_cat.speak() # 重写后的方法:咪咪(橘色)喵喵叫~ my_dog.shake_tail() # 子类特有方法:旺财摇尾巴卖萌~
👉 新手重点:
- • 子类定义时,括号里写父类名(
class 子类名(父类名)) - •
super().__init__()用来调用父类的初始化方法,继承属性 - • 子类可以重写父类的方法(同名方法覆盖父类),也能加新方法
3. 多态:同一操作,不同表现
多态就是“同一个方法,不同对象调用时表现不一样” ,不用写多个判断,就能让代码适配不同对象。
比如上面的例子:同样调用 speak() 方法,猫会喵喵叫,狗会汪汪叫——这就是多态,不用判断“这是猫还是狗”,直接调用就行。
🌰 代码示例:多态的实际用途
# 定义一个通用函数,接收任意Animal子类对象 def make_animal_speak(animal): animal.speak() # 同一操作,不同对象表现不同 # 创建不同对象 cat = Cat("咪咪", 2, "橘色") dog = Dog("旺财", 3, "金毛") # 调用同一个函数,自动适配不同对象 make_animal_speak(cat) # 输出:咪咪(橘色)喵喵叫~ make_animal_speak(dog) # 输出:旺财(金毛)汪汪叫~
多态让代码更灵活,以后新增“兔子”“鸟”等子类,不用改 make_animal_speak 函数,直接调用就行~
实操:用面向对象写一个“宠物管理系统”
整合三大特性,写一个简单的宠物管理系统,能添加猫和狗,让它们各自“说话”,联系类的写法及应用.
#!/usr/bin/env python #coding:utf-8 # 父类:动物 class Animal: def __init__(self,name,age): self.name = name self.age = age def speak(self): pass # 子类:猫 class Cat(Animal): def __init__(self,name,age,color): super().__init__(name,age) self.color = color def speak(self): return f"{self.name} {self.color},{self.age} 岁,喵喵叫!" # 子类:狗 class Dog(Animal): def __init__(self,name,age,breed): super().__init__(name,age) self.breed = breed # 定义狗的品种 def speak(self): return f"{self.name}({self.breed},{self.age}岁)汪汪叫~" #实例化对象 # cat = Cat('小橘','3','橘色') # dog = Dog("二哈",'5',"白色") # # print(cat.speak()) # print(dog.speak()) # 宠物管理系统(主类) class PetSystem: def __init__(self): self.pets = [] # 存储所有宠物对象 def add_pet(self,pet): self.pets.append(pet) print(f"成功添加宠物: {pet.name},{pet.age}岁") # 让所有宠物说话 def all_pets_speak(self): print("\n所有宠物的叫声:") for pet in self.pets: print(pet.speak()) if __name__ == "__main__": # 实例化对象 cat = Cat('小橘','3','橘色') dog = Dog("二哈",'5',"白色") pet_system = PetSystem() pet_system.add_pet(Cat("咪咪", 2, "橘色")) pet_system.add_pet(dog) pet_system.all_pets_speak()
参考文档:https://mp.weixin.qq.com/s/xnC2MbfBsMye0VmCX2gSyQ

浙公网安备 33010602011771号