[TOC]
組み合わせ
1.組み合わせは何ですか
オブジェクトを組み合わせたものを指しているプロパティの属性値は、クラスの他の目的であります
class Foo:
pass
class Bar:
pass
obj=Foo()
obj.attr=Bar()
obj.xxx
obj.attr.yyy
2.なぜあなたはの組み合わせを使用します
通过为某一个对象添加属性(属性的值是另外一个类的对象)的方式,可以间接地将两个类关联/整合/组合到一起,从而减少类与类之间代码冗余
class Foo1:
pass
class Foo2:
pass
class Foo3:
pass
class Bar:
pass
obj_from_bar=Bar()
obj1=Foo1()
obj2=Foo2()
obj3=Foo3()
obj1.attr1=obj_from_bar
obj2.attr2=obj_from_bar
obj3.attr3=obj_from_bar
3.シナリオの組み合わせを使用します
组合与继承都是有效地利用已有类的资源的重要方式。但是二者的概念和使用场景皆不同,
1.继承的方式
通过继承建立了派生类与基类之间的关系,它是一种'是'的关系,比如白马是马,人是动物。
当类之间有很多相同的功能,提取这些共同的功能做成基类,用继承比较好,比如老师是人,学生是人
2.组合的方式
用组合的方式建立了类与组合的类之间的关系,它是一种‘有’的关系,比如教授有生日,教授教python和linux课程,教授有学生s1、s2、s3...
当类之间有显著不同,并且较小的类是较大的类所需要的组件时,用组合比较好
実施例4.組み合わせ
class People:
school = 'Oldboy'
def __init__(self,name,age,sex,):
self.name = name
self.age = age
self.sex = sex
class Student(People):
def __init__(self, name, age, sex,score=0):
People.__init__(self,name,age,sex)
self.score = score
def choose_course(self):
print('%s choosing course' % self.name)
class Teacher(People):
def __init__(self,name,age,sex,level):
People.__init__(self,name,age,sex)
self.level=level
def score(self,stu,num):
stu.score=num
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 tell_info(self):
print('<课程名:%s 价钱:%s 周期:%s>' %(self.c_name,self.c_price,self.c_period))
# 创建课程对象
python=Course('python全栈开发',1900,'5mons')
linux=Course('linux架构师',900,'3mons')
stu1=Student('刘二蛋',38,'male')
stu1.course=python
# print(stu1.__dict__)
stu1.course.tell_info()
tea1=Teacher('egon',18,'male',10)
tea1.course=python
# print(tea1.__dict__)
tea1.course.tell_info()
ポリモーフィズム
1.多態性の定義:
多型は同じものの、様々な形態をいいます
2.多型オブジェクト:
また、ポリモーフィズム、継承、多態性として知られている多型は、プログラム内の現れです。多型の目的は、同一の関数(メソッド)は、異なる応答ができる場合には、オブジェクトの様々な異なるタイプのを可能にすることです。親クラス:基準の制服セットの定義、サブカテゴリー:統一基準の親に従ってください。ポリモーフィック究極の目標:ユーザーがより簡単に同じ機能のメソッドを呼び出すことができるようにするために、仕様の統一サブクラス製剤。多型の本質は団結です。
ポリモーフィズムを実現する方法3。
1.親クラスを継承
class Animal: # 父类定义一套统一的标准,不是为了实现某一具体功能,具体实现功能还是要继承的那些子类,这样使用者只需要学习父类的一套标准就行了。
def eat(self):
pass
def drink(self):
pass
def speak(self):
pass
# print('我们一起喵喵喵。。。。')
# 猪
class Pig(Animal):
# 吃
def eat(self):
print('猪在吃饭')
pass
# 喝
def drink(self):
pass
def speak(self):
# super().speak()
print('哼哼哼~~~')
# 猫
class Cat(Animal):
# 吃
def eat(self):
print('猫在吃饭')
# 喝
def drink(self):
pass
def speak(self):
print('喵喵喵~~')
# 狗
class Dog(Animal):
# 吃
def eat(self):
print('狗在吃饭')
# 喝
def drink(self):
pass
def speak(self):
print('汪汪汪~~~')
pig = Pig()
cat = Cat()
dog = Dog()
pig.speak()
cat.speak()
dog.speak()
2.抽象クラス
Pythonで親クラスのサブクラスの標準セットに従うことが必須ではないことに注意してください、あなたは親クラスの標準セットに従ってサブクラスを強制したい場合は、それらは、抽象クラスを使用します。1.は何ですか?目的のABC(abstract_class)使用モジュール2のインポート?サブクラスは親クラスを使用する方法3の必須標準のセットに従わなければなりませんか?輸入ABC
import abc
class Animal(metaclass=abc.ABCMeta):
# 吃
@abc.abstractmethod
def eat(self):
pass
# 喝
@abc.abstractmethod
def drink(self):
pass
# 叫
@abc.abstractmethod
def speak(self):
pass
# Animal() # 父类只是用来建立规范的,不能用来实例化,更无须实现内部的方法。会报错
# 猪
class Pig(Animal): # 子类在继承父类时,就必须遵循父类制定的规范,即遵守父类内部定义的抽象类方法,否则就报错
# 吃
def eat(self):
print('猪在吃饭')
pass
# 喝
def drink(self):
pass
def speak(self):
print('哼哼哼~~~')
# 派生
def run(self):
pass
pig = Pig()
3.ダックタイプ(標準親クラスに従う義務はお勧めしません)
現在のオブジェクトを知らなくても、状況のことですが、あなたは、あなたはアヒルです、アヒルのように見える:アヒルを入力します。注:Pythonでは、ない必須サブクラスは親クラスの標準セットに従わなければならないので、鴨の種類があります。
# python崇尚鸭子类型
class Disk:
def read(self):
print('Disk read')
def write(self):
print('Disk write')
class Memory:
def read(self):
print('Mem read')
def write(self):
print('Mem write')
class Cpu:
def read(self):
print('Cpu read')
def write(self):
print('Cpu write')
obj1=Disk()
obj2=Memory()
obj3=Cpu()
obj1.read()
obj2.read()
obj3.read()
4.三つの方法多型の長所と短所の実現
継承(または親クラスは抽象クラスを継承):カップリングは、あまりにも、高いスケーラビリティが悪いです;アヒルの種類:低カップリング、強力なスケーラビリティプログラム。