1. 程式人生 > >面向對象之進階繼承

面向對象之進階繼承

fat ons walk obj self. 劃線 init def tac

繼承是一種創建新類的方式,在python中,新建的類可以繼承一個或多個父類,父類又可稱為基類或超類,新建的類稱為派生或子類

Python中類的繼承分為:單繼承和多繼承 在python3中,所有類默認繼承boject 但凡是繼承了object類的子類,以及該子類的子類,都稱為新式類(在python3中所有的類都是 新式類) 沒有繼承objeck類的子類稱為經典類(在python2中,沒有繼承objeck的類,以及它的子類,都是經典類) # 經典類:深度優先 # 新生類:廣度優先 # 繼承順序:從左往右,至下而上 繼承是一種什麽‘是’什麽的關系 解決代碼重用的問題,減少代碼冗余
class People:
def __init__(self,name,age):
self.name=name
self.age=age
def walk(self):
print(‘%s is walking‘ %self.name)
class Teacher(People):
pass
class Student(People):
pass
t=Teacher(‘egon‘,18)
print(t.name,t.age)
print(t.__dict__)
t.walk()

派生就是有自己獨特的特征與技能
class People:
def __init__(self,name,age,sex):
self.name = name
self.age = age
self.sex = sex #父類
def walk(self):
print(‘%s is walking‘ % self.name)
def foo(self):
print(‘from father %s‘ %self.name)

class Teacher(People):
school=‘oldboy‘
def __init__(self,name,age,sex,level,salary):
People.__init__(self,name,age,sex)
self.level=level
self.salary=salary
def teach(self):
print(‘%s is teacher‘ %self.name)
def foo(self):
People.foo(self) #繼承與派生
print(‘form teacher‘)
class Student(People):
def __init__(self,name,age,sex,group):
People.__init__(self,name,age,sex)
self.group=group
def study(self):
print(‘%s is studying‘ %self.name)
t=Teacher(‘egon‘,18,‘male‘,10,3000)
t.foo()
t.teach()
print(t.level)

多態 python天生支持多態
# 抽象類和接口類 歸一化設計
# 編程思想:為子類做規範
# 歸一化設計:幾個類都實現了相同的方法
# 抽象類:最好單繼承,且可以簡單的實現功能
# 接口類:可以多繼承,且最好不實現具體功能
# 實現接口類和抽象類的語法
# from abc import abstractmethod,ABCMeta
# class 父類(metaclass=ABCMeta):
# @abstractmethod
# def func(self):pass

私有屬性:
# 所有帶雙下劃線的都是私有屬性,在外面調用需要變形
示列(1)
class Teacher:
__identifier = ‘Teacher‘ # 私有靜態屬性
def __init__(self,name,pwd):
self.name=name
self.__pwd=pwd # 私有屬性
self.__p()

def __p(self): # 私有方法
# print(self.__pwd)
return hash(self.__pwd)

def login(self,password):
return hash(password) == self.__p()

# print(Teacher._Teacher__identifier)
alex = Teacher("alex",3714)
ret = alex.login(3714)
print(ret)
示例(2)
# 例一:BMI指數(bmi是計算而來的,但很明顯它聽起來像是一個屬性而非方法,如果我們將其做成一個屬性,更便於理解)
# 成人的BMI數值:
# 過輕:低於18.5
# 正常:18.5-23.9
# 過重:24-27
# 肥胖:28-32
# 非常肥胖, 高於32
#   體質指數(BMI)=體重(kg)÷身高^2(m)
#   EX:70kg÷(1.75×1.75)=22.86
class Person:
def __init__(self,name,height,weight):
self.name = name
self.__height = height
self.__weight = weight

def get_bmi(self):
return self.__weight / (self.__height*self.__height)

def change_weight(self,new_weight):
if new_weight > 20:
self.__weight = new_weight
else:
print(‘體重過輕‘)
jinghong = Person(‘景弘‘,1.81,94)
print(jinghong.get_bmi())
jinghong.change_weight(88)
print(jinghong.get_bmi())

私有方法
class Foo:
def __jinghong_sb(self): #_Foo__jinghong_sb
print(‘Foo‘)
class Son(Foo):
# def __jinghong_sb(self):
# print(‘Son‘)
def func(self):
self.__jinghong_sb() #_Son__jinghong_sb
son = Son()
son.func()
#私有方法
#1.有一些方法的返回值只是用來作為中間結果
#2.父類的方法不希望子類繼承

拾遺(可命名元組)
from collections import namedtuple
Point = namedtuple(‘point‘,[‘x‘,‘y‘])
t1 = Point(1,2)
print(t1.x)
print(t1.y)
#沒有方法並且屬性不會發生變化的類
#定義簡單
#不能改變

property方法
房屋 :
業主 長 寬
面積
class Host:
def __init__(self,owner,length,width):
self.owner = owner
self.__length = length
self.__width = width

@property
def area(self):
return self.__length*self.__width

alex = Host("kaka",3,2)
print(alex.owner,alex.area)



面向對象之進階繼承