017-2018-09-26 面向物件-成員
阿新 • • 發佈:2018-12-18
1.今日內容大綱
一. 昨日內容回顧 1. 面向物件和麵向過程 1. 面向過程: 側重在過程. 事物的發展流程 優點: 編碼和入門簡單. 缺點: 可擴充套件性差. 2. 面向物件: 側重在物件. 萬事萬物皆為物件. None 優點: 可擴充套件性強(多型) 缺點: 上手難. 寫起來麻煩 在python中支援面向物件和麵向過程. 使用哪一個你自己決定. 2. 如何寫面向物件 1. 先建立類 class 類名: pass 2. 建立物件: 類名() 3. () 呼叫的是__init__() 構造方法. def __init__(self, 引數1,引數2, 引數3): # 屬性的繫結 self.屬性1 = 引數1 self.屬性2 = 引數2 self.屬性3 = 引數3 4. 方法(寫在類中的函式) def method(self): pass self: 當前正在執行的物件 物件.method() 3. 三大特徵: 封裝: 把一些資料封裝到一個物件中. 繼承: 子類繼承父類. 子類會自動擁有父類中除了私有內容外的其他所有內容, python是多繼承. 多型: 多一個物件有多種形態 二. 作業講解 三. 今天主要內容 成員 class Person: def __init__(self, name, num, gender, birthday): # 成員變數(例項變數) self.name = name self.num = num self.gender = gender self.birthday = birthday # 物件來訪問(成員方法)(例項方法) def marray(self, duifang): print("人會結婚%s" % duifang) 成員: 在類中定義的變數和方法都被成為成員 變數 1. 成員變數(例項變數)(欄位column) (重點) 2. 類變數(靜態變數) 直接寫在類中的. 共享出去的. 方法 1. 成員(例項)方法 加了self的.呼叫的時候。必須用物件去訪問. (重點) 2. 類方法, 當方法需要傳遞類名的時候. 需要類方法. 規範規則: 在上方加@classmethod 3. 靜態方法, 當你的方法不需要傳遞當前類的物件的時候。 語法規則:在方法上面加@staticmethod 面試題: 說一說, 靜態方法, 類方法和例項方法的區別. 屬性 用方法來描述我們的屬性資訊. 注意: 1. @propery 改變一個方法成為屬性 2. 這個方法只能有一個引數, self 3. 必須有返回值. 私有 只能在自己類中訪問. __方法 __變數 __類變數 都是私有. 比人訪問不到. 包括他兒子. 明天: 類與類的關係. 組合, 巢狀, 呼叫. 繼承.
2.練習
class Circle: def __init__(self, r): self.r = r def zhouchang(self): return 2 * 3.14 * self.r def mianji(self): return 3.14 * self.r * self.r c = Circle(5) print(c.zhouchang()) class Base1: def f1(self): print('base1,1') def f2(self): print('base1,f2') def f3(self): print('base2.f3') self.f1() class Base2: def f1(self): print('base2,f1') class Foo(Base1, Base2): def f0(self): print("foo.f0") self.f3() f = Foo() f.f0() class User: def __init__(self, username, password, email): self.username = username self.password = password self.email = email user_list = [] for i in range(3): user = input("請輸入使用者名稱:") pwd = input("請輸入密碼:") email = input("請輸入郵箱:") u = User(user, pwd, email) user_list.append(u) else: for u in user_list: print("我叫%s, 郵箱是:%s" % (u.username, u.email)) class User: def __init__(self, name, pwd): self.name = name self.pwd = pwd class Account: def __init__(self): self.user_list = [] # 資料來源 def login(self): print("歡迎來到登入環節") username = input("請輸入使用者名稱: ") password = input("請輸入密碼:") for u in self.user_list: if u.name == username and u.pwd == password: print("登入成功") return else: print("登入失敗") def register(self): print("歡迎來到註冊環節") uname = input("請輸入使用者名稱") pwd = input("請輸入密碼") u = User(uname, pwd) self.user_list.append(u) def run(self): while 1: print("1. 註冊") print("2. 登入") num = input("請輸入你要執行的操作(Q退出):") if num == "1": self.register() elif num == "2": self.login() elif num.upper() == "Q": print("退出") break else: print("你是不是傻") obj = Account() obj.run()
3.變數
class Person: country = "中國" # 類變數. 不屬於物件, 物件可以訪問. def __init__(self, name, num, gender, birthday): # 成員變數(例項變數) self.name = name self.num = num self.gender = gender self.birthday = birthday # 物件來訪問(成員方法)(例項方法) def marray(self, duifang): print("人會結婚%s" % duifang) alex = Person("李傑", 10086, "男", "昨天") alex.country = "澳大利亞" # 注意。 這裡和類變數沒由一毛錢關係, 給alex單獨加一個屬性叫country = ”澳大利亞“ wusir = Person("吳佩琪", 10010, "女", "今天") print(alex.country) # 澳大利亞 # 拿到的是自己的。成員例項變數 欄位 print(wusir.country) # 中國 print(Person.country) # 中國 # 總結:類變數,用類名去操作. 規範.
4.方法
class Person:
def __init__(self):
pass
# 例項方法需要傳遞類的物件 self
def think(self):
print("人能思考")
# 靜態方法不需要傳遞物件或者類
@staticmethod # 靜態方法
def jisuan(a, b):
print("我來過這裡")
return a + b
# 類方法: 第一個引數傳遞的是類名
@classmethod
def clsMethod(cls): # cls表示的類
p = cls() # 可以動態的建立物件.
print("我是一個類方法", p)
# p = Person()
# p.think()
#
# Person.think(p)
# 靜態方法的呼叫:
# c = Person.jisuan(1, 2) # 類名可以訪問
# print(c)
#
# p = Person()
# d = p.jisuan(3, 5) # 用物件也可以訪問
# print(d)
# 記住, 靜態的內容用類名訪問
Person.clsMethod() # 類方法預設第一個引數接收的是類名
5.屬性
class Person:
def __init__(self, name, num, gender, birthday):
self.name = name
self.num = num
self.gender = gender
self.birthday = birthday
@property # 表示當前方法是一個屬性. 方法的返回值就是這個屬性的值
def age(self): # 方法只能有一個引數, self
return 10 # 必須有返回值
p = Person("alex", "10086", "不詳", "1989年12月1日")
print(p.age) # 可以直接訪問屬性, 實際上訪問的是age()方法. 返回值就是屬性值
6.私有
class Tiger:
def __init__(self, name, waibiao, qingzhenglianjiedezuofeng, qingfu, money, fangchan):
self.name = name
self.waibiao = waibiao
self.qingzhenglianjiedezuofeng = qingzhenglianjiedezuofeng
self.__qingfu = qingfu
self.__money = money
self.__fangchan = fangchan
def buy(self):
print("我有%s" % self.__money)
self.__sel()
def __sel(self):
print("我要賣掉%s" % self.__fangchan)
lh = Tiger("alex", "正直", "非常剛正不阿, 666", "小潘潘", 10000000000, 5)
print(lh.qingzhenglianjiedezuofeng)
print(lh.name)
print(lh.waibiao)
lh.buy()
# lh.__sel()
# print(lh.__money)