組合,多態,封裝
阿新 • • 發佈:2018-08-21
abstract 內容 teacher courses 對象 不想 ini prope 檢測
一、組合
組合指的是某一個對象擁有一個屬性,該屬性的值是另一個對象
如下
class Foo: pass class Bar(): pass obj = Foo() obj.attr = Bar()
通過為某一個對象添加屬性(屬性的值為另一個對象)的方式,可以間接地將兩類關聯/整合到一起,從而減少類與類之間的代碼冗余。
案例如下:
class Person: def __init__(self, name, age, sex): self.name = name self.age= age self.sex = sex class Student(Person): def __init__(self, name, age, sex, score=0): super(Student, self).__init__(name, age, sex) self.score = score self.courses = [] def study(self): print(‘%s正在學習‘ % self.name) def all_course_info(self):for obj in self.courses: obj.show() class Teacher(Person): def __init__(self, name, age, sex, level): super().__init__(name, age, sex) self.level = level self.courses = [] def work(self): print(‘%s正在去上課的路上‘ % self.name) def all_course_info(self):for obj in self.courses: obj.show() class Course: def __init__(self, c_name, c_price, c_period): self.c_name = c_name self.c_price = c_price self.c_period = c_period def show(self): print(‘課程名:%s 課程價格:%s 課程周期:%s‘ % (self.c_name, self.c_price, self.c_period)) python = Course(‘python全棧開發‘, 1000, ‘6個月‘) linux = Course(‘linux‘, 500, ‘3個月‘) stu1 = Student(‘Yven‘, 18, ‘male‘) stu1.courses.append(python) stu1.courses.append(linux) stu1.all_course_info() tea1 = Teacher(‘Hwt‘, 18, ‘female‘, 10) tea1.courses.append(python) tea1.all_course_info()
二、多態
多態指的是同一種/類食物的不同形態,不同的子類對象調用相同的父類方法,產生不同的執行結果,多態可以增加代碼靈活度,以繼承和重寫父類方法為前提,是調用方法的技巧,不會影響到類的內部手機
案例如下:
import abc class Animal(metaclass=abc.ABCMeta): @abc.abstractmethod def speak(self): pass @abc.abstractmethod def run(self): pass class Person(Animal): def speak(self): print(‘hello‘) def run(self): pass class Dog(Animal): def speak(self): print(‘汪汪汪‘) def run(self): pass class Pig(Animal): def speak(self): print(‘oooo‘) def run(self): pass obj1 = Person() obj2 = Dog() obj3 = Pig() obj1.speak() obj2.speak() obj3.speak()View Code
三、封裝
封裝顧名思義就是封與裝
裝指的是往容器/名稱空間裏存入名字
封指的是將內存放於名稱空間中的名字給藏起來,這種隱藏對外不對內
案例如下:
import abc class Animal(metaclass=abc.ABCMeta): @abc.abstractmethod def speak(self): pass @abc.abstractmethod def run(self): pass class Person(Animal): def speak(self): print(‘hello‘) def run(self): pass class Dog(Animal): def speak(self): print(‘汪汪汪‘) def run(self): pass class Pig(Animal): def speak(self): print(‘oooo‘) def run(self): pass obj1 = Person() obj2 = Dog() obj3 = Pig() obj1.speak() obj2.speak() obj3.speak()View Code
在類內定義的屬性前加__開頭就可以實現封裝的對外不對內的隱藏
總結:
1.__開頭的屬性實現的隱藏僅僅只是一種語法意義上的變形,並不會真的限制類外部的訪問
2.該變形操作只在類定義階段檢測語法時發生一次,類定義階段之後新增的__開頭的屬性並不會變形
3.如果父類不想讓子類覆蓋自己的屬性,可以在屬性前加__開頭
四、property
property裝飾器是用來將類內的函數屬性偽裝成數據屬性
案例如下:
class People: def __init__(self,name,weight,height): self.name=name self.weight=weight self.height=height @property def bmi(self): return self.weight / (self.height ** 2) obj=People(‘egon‘,80,1.83) obj.height=1.85 obj.weight=75 print(obj.bmi()) print(obj.bmi)
了解內容:
class People: def __init__(self,name): self.__name=name @property def name(self): return ‘<名字:%s>‘ %self.__name @name.setter def name(self,obj): if type(obj) is not str: print(‘name必須為str類型‘) return self.__name=obj @name.deleter def name(self): # print(‘不讓刪‘) del self.__name obj=People(‘egon‘) # print(obj.name) # obj.name=‘EGON‘ # obj.name=123 # print(obj.name) del obj.name print(obj.__dict__)
組合,多態,封裝