1. 程式人生 > 實用技巧 >面向物件之組合、多型、以及內建函式及方法等相關內容-27

面向物件之組合、多型、以及內建函式及方法等相關內容-27

1.在子類派生的新方法中重用父類功能的方式二

# 1\在子類派生的新方法中重用父類的功能
# 方式一:指名道姓地呼叫某一個類的函式
# 特點:不依賴於繼承關係
#
# class OldboyPeople:
# school = "oldboy"
# # 空物件,"艾利克斯",73,'male'
# def __init__(self,name,age,gender):
# self.name = name
# self.age = age
# self.gender = gender
#
# def f1(self):
# print('1111111')
#
# class Student(OldboyPeople):
# # 空物件,"艾利克斯",73,'male',1001,"python全棧開放"
# def __init__(self,name,age,gender,stu_id,course):
# OldboyPeople.__init__(self,name,age,gender) # OldboyPeople.__init__(空物件,"艾利克斯",73,'male')
# self.stu_id = stu_id
# self.course = course
#
#
# def choose(self):
# print('%s 正在選課' %self.name)
#
# def f1(self):
# OldboyPeople.f1(self)
# print("22222")
#
# stu1=Student("艾利克斯",73,'male',1001,"python全棧開放")
# # tea1=Teacher("egon",18,'male',2000,10)
#
#
# stu1.f1()



# 2 在子類派生的新方法中重用父類功能的方式二
# 方式一:呼叫super(自己的類名,self)會返回一個特殊的物件,super(自己的類名,self).屬性,會參照屬性查詢發起的那個類的mro列表去它父類中查詢屬性
# 特點:嚴格依賴於繼承關係
# class OldboyPeople:
# school = "oldboy"
# # 空物件,"艾利克斯",73,'male'
# def __init__(self,name,age,gender):
# self.name = name
# self.age = age
# self.gender = gender
#
# def f1(self):
# print('1111111')
#
# class Student(OldboyPeople):
# def __init__(self,name,age,gender,stu_id,course):
# # OldboyPeople.__init__(self,name,age,gender) # OldboyPeople.__init__(空物件,"艾利克斯",73,'male')
# super(Student,self).__init__(name,age,gender)
# self.stu_id = stu_id
# self.course = course
#
#
# def choose(self):
# print('%s 正在選課' %self.name)
#
# def f1(self):
# # OldboyPeople.f1(self)
# # super().f1()
# print("22222")
#
# # print(Student.mro())
# stu1=Student("艾利克斯",73,'male',1001,"python全棧開放")
# # print(stu1.__dict__)
# stu1.f1()


#3:
# class A:
# def test(self):
# super().test()
# class B:
# def test(self):
# print('from B')
# class C(A,B):
# pass

# c=C()
# print(C.mro())
# c.test()

# obj=A()
# obj.test()

#4:
class A:
def test(self):
print('A---->test')
super().aaa()
class B:
def test(self):
print('B---->test')

def aaa(self):
print('B---->aaa')

class C(A,B):
def aaa(self):
print('C----->aaa')

c=C()
print(C.mro())
c.test()
"""
A---->test
B---->aaa
"""

2.組合

# 組合:把另外一個類的物件賦值給當前物件的屬性
# 組合表達的是一種有的關係
class Teacher:
def __init__(self, name, age, gender, level):
self.name = name
self.age = age
self.gender = gender
self.level = level

def tell(self):
print("%s:%s" % (self.name, self.age))


class Student:
def __init__(self, name, age, gender):
self.name = name
self.age = age
self.gender = gender


class Course:
def __init__(self, name, price, period):
self.name = name
self.price = price
self.period = period

def tell(self):
print('<%s:%s:%s>' % (self.name, self.price, self.period))


tea1 = Teacher("egon", 18, "male", 10)
stu1 = Student("xxx", 19, "male")

python = Course("python開放", 30000, "3mons")
linux = Course("linux課程", 30000, "3mons")

tea1.courses = [python,linux]
stu1.course = python

# tea,stu # 超級物件

# stu1.course.tell()
for course_obj in tea1.courses:
course_obj.tell()

3.多型

"""
同一種事物有多種形態
例如:動物這種事物有多種形態,如人\狗\豬
特性: 我們可以在不考慮某一個物件具體型別的前提下,直接使用該物件
"""
# 父類有的功能,子類一定有
# import abc
#
# class Animal(metaclass=abc.ABCMeta):
# @abc.abstractmethod
# def speak(self):
# pass
#
# @abc.abstractmethod
# def run(self):
# pass
#
# # Animal() # Animal的作用是用來制定標準的
#
# class People(Animal):
# def speak(self):
# print("啊啊啊啊")
#
# def run(self):
# print("咻咻咻...")
#
# class Dog(Animal):
# def giao(self):
# print("汪汪汪")
#
# class Pig(Animal):
# def heheng(self):
# print("哼哼哼")

# peo1=People()
# d1=Dog()
# p1=Pig()

# peo1.jiao()
# d1.giao()
# p1.heheng()




# peo1.speak()
# d1.speak()
# p1.speak()

# def speak(animal):
# animal.speak()
#
# speak(peo1)
# speak(d1)
#
# speak(p1)




# 鴨子型別:duck
# class People:
# def speak(self):
# print("啊啊啊啊")
#
# def run(self):
# print("咻咻咻...")
#
# class Dog:
# def speak(self):
# print("汪汪汪")
#
# def run(self):
# print("狂奔...")
#
# class Pig:
# def speak(self):
# print("哼哼")
#
# def run(self):
# print("咣咣咣...")
#
#
# peo1=People()
# d1=Dog()
# p1=Pig()


# peo1.run()
# d1.run()
# p1.run()



class Cpu:
def read(self):
pass

def write(self):
pass

class Process:
def read(self):
pass

def write(self):
pass

class Disk:
def read(self):
pass

def write(self):
pass

4.一切皆為物件

# 資料型別 == 類
# x = 11 # x=int(11)
# print(int)

# class Foo:
# pass
# print(Foo)

x = [1,2,3] # list([1,2,3])
y = [111,222] # list([1,2,3])
# x.append(4)
# y.append(3333)

# list.append(x,4)
# list.append(y,333)

# print(x)
# print(y)


print(type(x))

5.內建函式


x = 111

print(type(x) is int)

print(isinstance(x,int))
# 該物件是否屬於這個類

class Bar:
pass

class Foo(Bar):
pass
print(issubclass(Foo,Bar))
# 該類是否屬於另一個類的子類

6.內建方法

#  內建方法都是在滿足某種條件下自動觸發的
# 1 __str__
# class People:
# def __init__(self, name, age):
# self.name = name
# self.age = age
#
# def __str__(self):
# # print('===>')
# return "<%s:%s>" %(self.name,self.age)
#
# obj = People("egon", 18)
#
# print(obj) # print(obj.__str__())


# 2 __del__
class People:
def __init__(self, name, age,f):
self.name = name
self.age = age
self.f = f

def __del__(self):
print('===>')
# 回收資源
self.f.close()

obj = People("egon", 18,open("a.txt",'w',encoding='utf-8'))

del obj
# print('執行完畢...')