Python全棧之面向對象基礎
更新時間:2021年11月30日 15:06:04 作者:熬夜泡枸杞
這篇文章主要為大家介紹了Python面向對象基礎,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
1. 面向對象oop了解
# ### oop 面向對象的程序開發(fā)
# (1) 類的定義
# 1
class Car:
pass
# 2 推薦
class Car():
pass
# 3.
class Car(object):
pass
# (2)類的實例化
class Car():
pass
obj = Car()
print(obj)
# (3)類的基本結構
"""
類中兩樣東西:
(1)成員屬性
(2)成員方法
"""
class Car():
# 成員屬性
color = "白色"
# 成員方法
def didi():
print("小車會嚓嚓的叫")
# 語法上不報錯,但是嚴禁使用,破壞了類中的結構,不要裸露的把判斷和循環(huán)直接寫在類中,而是用方法包起來
class Car():
if 5 ==5 :
print(11223344)
# (4)類的命名
"""類的命名 : 推薦使用大駝峰命名法,每個單詞的首字母都要大寫"""
"""
mycar => MyCar
zhangbaozhang => ZhangBaoZhang
"""
2. 對象的相關操作
# ### 面向對象的封裝 - 對象的操作
"""
封裝:
1.私有 : 在類內(nèi)可以互相訪問,在類外不能訪問
2.公有 : 在類內(nèi)或者類外都可以訪問
類中成員:
1.成員屬性
2.成員方法
綁定方法:
1.綁定到對象 : 當對象去調(diào)用類中成員方法時,系統(tǒng)會默認把該對象當成參數(shù)傳遞給該方法
2.綁定到類 : 當對象或者類去調(diào)用類中成員方法時,系統(tǒng)會默認把該類當成參數(shù)傳遞給該方法
使用方式:
對象.成員屬性
對象.成員方法
"""
class MyCar():
# 公有屬性
logo = "布加迪威龍"
# 私有屬性
__price = "2000萬"
# 公有方法
def run(self):
print("百公里油耗300L,logo={} , price={}".format(self.logo, self.__price))
# 私有方法
def __info(self):
print("車主信息保密,據(jù)說是某個房地產(chǎn)大佬的兒子")
# 實例化對象(類的實例化)
obj = MyCar()
# (1)實例化的對象訪問成員屬性和方法
# 公有
print(obj.logo)
obj.run()
# 私有 (私有成員無法在類外訪問,類內(nèi)可以)
# obj.__price error
# obj.run()
# obj.__info() error
#(2)實例化的對象動態(tài)添加公有成員屬性
obj.color = "尿黃色"
obj.logo = "五菱宏光"
print(obj.color)
print(obj.logo)
# __dict__ 獲取類對象的內(nèi)部成員
print(obj.__dict__)
print(MyCar.__dict__)
#(3)實例化的對象動態(tài)添加公有成員方法
# 1.無參方法
def dahuangfeng():
print("請加我大黃蜂")
obj.dahuangfeng = dahuangfeng
obj.dahuangfeng()
# 2.有參方法
# 基本版
def qingtianzhu(name):
print("請叫我一柱擎天么,{}".format(name))
obj.qingtianzhu = qingtianzhu
obj.qingtianzhu("擎天柱")
# 升級版
def qingtianzhu(obj,name):
print("請叫我一柱擎天么,{},我的顏色是{}".format(name,obj.color))
obj.qingtianzhu = qingtianzhu
obj.qingtianzhu(obj,"擎天柱")
# 究極版
"""如果要創(chuàng)建綁定方法,參數(shù)的順序,self對象本身要放到第一位."""
def qingtianzhu(obj,name):
print("請叫我一柱擎天么,{},我的顏色是{}".format(name,obj.color))
import types
# 創(chuàng)建綁定方法,系統(tǒng)自動把該對象當成參數(shù)傳遞給方法;
# types.MethodType(方法,對象) => 綁定方法
res = types.MethodType(qingtianzhu,obj)
print(res)
obj.qingtianzhu = types.MethodType(qingtianzhu,obj)
obj.qingtianzhu("擎天柱")
# 3.lambda表達式
obj.weizhentian = lambda : print("我是威震天")
obj.weizhentian()
小提示:
類對象在調(diào)用方法,如果方法是類外的(自定義的方法),那么不會自動傳參的(不會把類對象傳到方法里面) self是用來接收對象這參數(shù)(self只是一個名字而已,無所謂,習慣用self)

3. 類的相關操作
# ### 面向對象的封裝 - 類的操作
"""
使用方式:
類.成員屬性
類.成員方法
"""
class MyCar():
# 公有成員屬性
platenum = "京A7758BB"
# 私有成員屬性
__earning = "月收入6000"
# 公有成員方法
def car_info():
print("牌照信息可以公開")
print("<======>")
MyCar.__money_info()
# 私有成員方法
def __money_info():
print( "收入信息保密" , MyCar.__earning )
# (1)定義的類訪問公有成員屬性和方法
print(MyCar.platenum)
MyCar.car_info()
# MyCar.__money_info() error
# (2)定義的類動態(tài)添加公有成員屬性
MyCar.oil = "1000L"
print(MyCar.oil)
print(MyCar.__dict__)
# (3)定義的類動態(tài)添加公有成員方法
# 1.無參方法
def car_light():
print("我是造車燈的方法")
MyCar.car_light = car_light
MyCar.car_light()
# 2.有參方法
def car_engine(name):
print("我是造{}發(fā)動機的方法".format(name))
MyCar.car_engine = car_engine
MyCar.car_engine("三缸發(fā)動機")
# 3.lambda表達式
MyCar.luntai = lambda : print("我是造輪胎的方法")
MyCar.luntai()
# 對比 對象和類之間的不同
"""
1.類中的無參方法默認只能類來調(diào)用,對象無法調(diào)取
2.對象可以調(diào)用類中的成員,反過來,類不能調(diào)用對象中的成員
3.每創(chuàng)建一個對象都會在內(nèi)存中占用一份空間,對象之間是彼此獨立的;
"""
obj = MyCar()
# obj.car_info() error
MyCar.car_info()
obj.price = "10萬"
print(MyCar.price)
4. 類對象的刪除操作
# ### 1.如何在類外訪問私有成員
class Plane():
# 公有成員
captian = "趙沈陽"
# 私有成員
__air_sister = "3名空姐"
# 公有綁定方法
def fly(self):
print("飛機要非要平流層,才能減少震動",self.__air_sister)
# 私有綁定方法
def __age(self):
print("空姐年齡保密")
# 公有無參方法
def fly2():
print("航天飛機飛到天空層,翱翔太空")
# 私有無參方法
def __earn():
print("機長的收入保密")
def pub_get1(self):
print(self.__air_sister)
self.__age()
def pub_get2():
print(Plane.__air_sister)
Plane.__earn()
# 實例化對象
obj = Plane()
# 方法一.訪問私有成員 (不推薦)
# python私有化: 采取了改名策略 => _類名 + __air_sister
# print(obj.__air_sister)
print(obj._Plane__air_sister)
print(Plane.__dict__)
"""
{'__module__': '__main__', 'captian': '趙沈陽',
'_Plane__air_sister': '3名空姐',
'fly': <function Plane.fly at 0x7f2774616158>, '_Plane__age': <function Plane.__age at 0x7f27746161e0>, 'fly2': <function Plane.fly2 at 0x7f2774616268>, '_Plane__earn': <function Plane.__earn at 0x7f27746162f0>, '__dict__': <attribute '__dict__' of 'Plane' objects>, '__weakref__': <attribute '__weakref__' of 'Plane' objects>, '__doc__': None}
"""
# 方法二.訪問私有成員 (使用類中的公有方法,間接訪問私有成員) (推薦)
obj = Plane()
obj.pub_get1()
Plane.pub_get2()
# ### 2.使用類對象刪除相應的成員
"""
1.對象可以訪問類中的公有成員,但是無權修改或者刪除該類中的成員
2.對象在訪問成員時,優(yōu)先訪問該對象自己的成員,如果沒有在訪問類的,類如果也沒有直接報錯;
"""
# 刪除對象成員屬性
obj.captian = "趙世超"
del obj.captian
print(obj.captian)
# 刪除對象成員方法
obj.basketball = lambda : print("我的私人飛機可以在天上打籃球")
print(obj.__dict__)
obj.basketball()
del obj.basketball
print(obj.__dict__)
# obj.basketball() error
# 刪除類中成員屬性
del Plane.captian
print(Plane.__dict__)
# Plane.captian
# print(obj.captian) error
# 刪除類中成員方法
del Plane.fly2
# Plane.fly2() error
# 注意: 對象無法調(diào)無參方法!! 返回來,類可以調(diào)用對象的綁定方法么? 可以!!
Plane.fly(obj)
小提示:
如果在類外添加公有方法
def __abc():
print(1)
在類外定義的方法__abc()只是簡單的函數(shù)名字而已,之后在類里面定義
的時候,__abc()才是私有方法。
刪除或創(chuàng)建私有的方法,要在類外去操作
對象在調(diào)用屬性的時候,先看自己有沒有,然后在看類中的屬性
class Plane():
def fly1(self):
print("飛機要起飛")
def fly2(self):
print("飛機真的要起飛了",self.captian)
def fly3():
print("飛機不起飛")
Plane.fly1(1) 類可以調(diào)用有參的方法,隨便穿個值進去即可
Plane.fly2(1) 這樣的話就報錯,Plane.fly2(obj) 把對象傳進去就可以出結果
如果說對象調(diào)用類中無參的方法是不會成功的
5. 小練習
1.請定義一個交通工具(Vehicle)的類,其中有: 屬性:速度(公有speed), 車的類型(私有type) 方法:速度(公有setSpeed),加速(私有speedUp),減速(私有speedDown) 讓公有setSpeed調(diào)用私有speedUp和私有speedDown 2.用類改寫:猜數(shù)字游戲: 一個類有兩個成員num和guess, num有一個初值100。 定義一個方法guess, 調(diào)用guess,如果大了則提示大了,小了則提示小了。等于則提示猜測成功。 3.創(chuàng)建一個圓Circle類。 為該類提供一個變量r表示半徑 方法一返回圓的面積,方法二返回圓的周長;
小提示:
如果在類內(nèi)的話,都是用對象調(diào)用方法或變量(self.speed、self.eat()),如果不是類的話,可以直接調(diào)變量和方法 r = 3 歸屬于circle這個類 self.r = r 歸屬于self這個對象
答案:
"""
1.請定義一個交通工具(Vehicle)的類,其中有:
屬性:速度(公有speed), 車的類型(私有type)
方法:速度(公有setSpeed),加速(私有speedUp),減速(私有speedDown)
讓公有setSpeed調(diào)用私有speedUp和私有speedDown
"""
class Vehicle():
speed = "百公里1小時"
__type = "拖拉機小蹦蹦"
def setSpeed(self):
self.__speedUp()
self.__speedDown()
def __speedUp(self):
print("我是加速方法,速度{}".format(self.speed))
def __speedDown(self):
print("我是減速方法,小車的類型是{}".format(Vehicle.__type))
obj = Vehicle()
obj.setSpeed()
"""
2.用類改寫:猜數(shù)字游戲:
一個類有兩個成員num和guess,
num有一個初值100。
定義一個方法guess,
調(diào)用guess,如果大了則提示大了,小了則提示小了。等于則提示猜測成功。
"""
import re
class GuessGame():
num = 100
def guess(self):
while True:
n = input("請輸入要猜測的數(shù)字")
obj = re.search(r"^\d+$",n)
# print(obj)
if obj:
n = int(obj.group())
if n > self.num:
print("大了..")
elif n < self.num:
print("小了..")
elif n == self.num:
print("ok~ bingo")
break
else:
print("輸入的內(nèi)容不正確")
# obj = GuessGame()
# obj.guess()
"""
3.創(chuàng)建一個圓Circle類。
為該類提供一個變量r表示半徑
方法一返回圓的面積,方法二返回圓的周長;
"""
import math
class Circle():
r = 3
def area(self):
return math.pi * self.r ** 2
def perimeter(self):
return 2 * math.pi * self.r
obj = Circle()
res1 = obj.area()
res2 = obj.perimeter()
print(res1,res2)
# 方法二 (推薦)
import math
class Circle():
def __init__(self,r):
self.r = r
def area(self):
return math.pi * self.r ** 2
def perimeter(self):
return 2 * math.pi * self.r
obj = Circle(4)
res1 = obj.area()
res2 = obj.perimeter()
print(res1,res2)
總結
本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關注腳本之家的更多內(nèi)容!
相關文章
pycharm中:OSError:[WinError?1455]頁面文件太小無法完成操作問題的多種解決方法
這篇文章主要給大家介紹了關于pycharm中:OSError:[WinError?1455]頁面文件太小無法完成操作問題的多種徹底解決方法,文中通過圖文介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2023-02-02
python使用numpy實現(xiàn)直方圖反向投影示例
今天小編就為大家分享一篇python使用numpy實現(xiàn)直方圖反向投影示例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-01-01

