1. 程式人生 > >017-2018-09-26 面向物件-成員

017-2018-09-26 面向物件-成員

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)