1. 程式人生 > >第六章:面向物件

第六章:面向物件

文章目錄

第一節:關於類

面向物件

  • 面向物件

之前我們介紹過函式,函式是對程式語句的封裝與複用;
類是則是對 變數函式 的封裝和複用,封裝有機關聯的變數和函式為類,變數和函式,稱為 類的屬性方法
由於類比函式的封裝又提高了一個層次,因此複用性也得到進一步提升;(試想一下維護100個函式直觀容易,還是維護5個類直觀容易呢?)
面向過程的程式設計是以 函式 為核心的,而面向物件的程式設計是以 為核心的,一切功能的實現,都是通過建立一個司職該功能的類的例項,進而呼叫其方法去予以實現的;
以類為核心的、面向物件的程式設計,提高了程式碼的模組化程度,便於大規模協作的開展;
在面向物件的程式開發(Object-Oriented-Programming或OOP)中,架構師的工作,往往只是模組拆分、介面定義、例項組裝,類內部的具體方法介面的實現,則交由其他人去完成;
現如今的高階語言,基本都是面向物件的;
面向物件的三大特性: 封裝

繼承多型
另一種提法是四大特性,即三大特性的基礎上,再加上一個 抽象

  • 封裝

封裝就是將常用的程式碼段封裝為函式,常用的函式封裝為類,常用的類封裝為模組與類庫;
封裝提高了程式碼的可維護性和複用性,同時也更利於開源與傳播;
封裝性催生了模組化,便於大規模協作開發的開展;

  • 繼承

正如自然界中,動物=>人=>程式設計師的關係,人是動物類的一個分支,程式設計師是人的一個分支,在程式設計中,我們可以通過繼承來表達這樣的關係;
動物類是人類的父類(又叫超類),人是程式設計師的父類;
動物類的共同特徵,如都有生命、都會新陳代謝、都會死亡等等,在定義人這個類時,是無需重複宣告的,這樣就在一層層的繼承中,節省了大量的程式碼;
有繼承就有發展,否則繼承就沒有意義;

【程式設計中的繼承】
在程式設計中,發展體現為:
①在父類的基礎上增加新的屬性與方法;
②重寫(或者叫覆寫、覆蓋)父類方法;
對父類方法的覆寫,又可以分為【顛覆式】和【改良式】兩種;
【顛覆式】覆寫是指子類全盤否定父類方法實現,由子類自己做一個全新的實現;
【改良式】覆寫是指子類先將父類的實現拿過來,再進行新的拓展;

  • 多型

在繼承的基礎上,一個父類會有不同的子類實現,如戰士父類可以有騎兵、步兵、弓弩手等不同子類;
多型,即【一個父類可以有多種不同的子類形態】;

【多型的共性與個性】
在多型中,同源子類之間,既存在共性,又存在個性,共性與個性各有其用處;
例如騎兵、步兵、弓弩手都是戰士的子類,因此他們都有進攻方法與防守方法,這就是【共性】;
而他們的具體進攻方法各自有不同的實現,騎兵衝鋒、步兵肉搏、弓弩手射箭,這就是【個性】;
在一支由不同兵種組成的軍隊中(即戰士例項的集合),當總司令下達全體進攻的命令時,不同兵種做何種具體形式的進攻(個性)是不重要的,重要的是共性;
當司令想要採用一些細膩的戰術時,比如先進行一輪齊射,再由騎兵進行一輪踩踏,最後上步兵打掃戰場,此時不同兵種的差異化進攻方式則展現其價值,此時個性變得重要;
共性是由父類所帶來的,個性是由子類覆寫所帶來的;

  • 抽象

在繼承和多型中,如果父類不對某個方法做任何實現,只是留白,具體的實現交由子類自己去完成,這時我們稱該方法是抽象的;
如果一個父類中的所有方法都是抽象的,我們就稱該類為一個【介面】;
抽象是一種藝術,架構師就是這種藝術的玩弄者;
架構師所做的工作,就是拆分模組,定義介面,完成預組裝,形成一具沒有血肉的架,然後將填充的工作下放到團隊中的不同程式設計師,填充完成之日即是專案大廈落成之時;

類的封裝

例:

  • 封裝一個人的類Person,需求如下:

    1、封裝以下屬性:姓名、年齡、存款
    2、封裝自我介紹方法,陳述以上屬性
    3、建立一個人,設定其基本資訊
    4、列印此人資訊
    5、令此人進行自我介紹

# 封裝一個Person類,將與人有關的屬性、方法組合在一起,以便將來複用
class Person:
    # 屬性定義和預設值
    name = "林阿華"
    age = 20
    rmb = 50

    # 構造方法:外界建立類的例項時會呼叫
    # 構造方法是初始化例項屬性的最佳時機
    def __init__(self,name,age,rmb):
        print("__init__的方法被呼叫了")
        self.name = name
        self.age = age
        self.rmb = rmb

    # 自我介紹方法
    #  self = 類的例項
    def tell(self):
        print("我是%s,我%d歲了,我有存款%.2f萬元"%(self.name,self.age,self.rmb))
  • 建立例項p,並呼叫Person的tell()方法
# 建立Person類的例項
p = Person("易阿天",60,500)

# 呼叫例項的tell方法
p.tell()

執行結果:
在這裡插入圖片描述

注意將Person的屬性和方法使用一個 標準制表符 縮排在Person的類定義以內;
“_ init _” 是類的構造方法,用於建立類的例項,左右各有兩個下劃線;
使用PyCharm輸入完def __init時系統彈出提示,IDE會自動完成方法的定義;
每個方法在定義時,系統會自動加上一個 self 引數在第一個引數位,這個引數代表將來建立的例項本身;
再呼叫方法時, self 是不必親自傳入的,self是系統用來標識例項本身的;
構造方法的呼叫形式為: Person(self以外的其它引數)

類的私有成員

【成員】就是指類的屬性方法
【私有】,即不能再類的外界進行訪問;
目的是為了 保障安全 ,如涉及隱私的屬性、核心方法實現等;

例:

  • 封裝一個人的類Person,需求如下:
    1、建立一個Person類,新增存款資訊
    2、保護存款資訊,將其設定為私有
    3、為存款資訊新增保護,使其不能被直接訪問
    4、增加設定密碼功能 ·增加存款查詢功能
    5、只有輸入密碼正確的情況下才能查詢存款資訊
class Person:
    # 普通屬性與私有屬性
    name = "林阿華"
    age = 20
    __rmb = 1000  #(須通過公有方法來訪問)

    #  私有方法:設定存款
    def __setrmb(self,rmb):
        self.__rmb = rmb

    #  通過普通方法訪問私有方法進行存款設定
    def setrmb(self,rmb):
        pwd = input("請輸入設定密碼:")
        if (pwd == "123456"):
            self.__setrmb(rmb)
        else:
            print("您沒有許可權")

    #  公開一個普通方法,共外界訪問私有屬性self.__rmb
    def getrmb(self):
        pwd = input("請輸入查詢密碼:")
        if (pwd == "123456"):
            return self.__rmb
        else:
            return "您沒有訪問許可權"

    #  普通方法
    def tell(self):
        print("大家好,我是%s"%(self.name))
  • 建立Person例項,並通過公有方法訪問私有成員
p = Person()

#通過例項訪問類的普通屬性
print(p.name)
print(p.age)

# 私有成員不能被直接訪問
#  print(p.__rmb)        # AttributeError: 'Person' object has no attribute '__rmb'


#通過例項訪問類的普通方法
p.tell()

#通過普通方法訪問私有屬性
rmb = p.getrmb()
print("我的存款是:",rmb)

# 通過普通方法訪問私有方法
p.setrmb(500)
rmb = p.getrmb()
print("我的存款是:",rmb)

執行結果:
在這裡插入圖片描述- 注意的幾個問題
1、程式碼中的__rmb屬性、__setrmb方法都是私有的,在類的外部是無法p.__rmb進行直接訪問的;
2、任何前置兩個下劃線的成員(屬性與方法)都是私有的,只能在類的內部進行訪問;
外界訪問私有成員的方法是,使用公有方法對外界提供私有成員訪問介面,但在內部先行進行許可權校驗,如輸入密碼等,如本例中的setrmb方法和getrmb方法;

類的專有方法

  • 概述

當類沒有繼承於任何類時,它預設繼承的是 【系統的object】
在object類中,定義了許多專有方法,它們的方法名是這樣的:_ xxx _,左右各有兩個下劃線;
專有方法不是用來給例項直接呼叫的,而是有其特定的用途,比如_ init _是在外界呼叫類名建立例項時呼叫的;
再比如,當外界print(obj)時,其輸出的字串其實是來源於obj對應的類的_ str _方法的返回值的;

  • 常見專有方法

    ___init___ : 建構函式,在生成物件時呼叫
    ___del___ : 解構函式,釋放物件時使用
    ___str___:例項的列印樣式
    ___len___: 獲得長度
    ___ gt___: 比較大小(物件之間進行算術運算後,應返回一個計算後的結果)
    ___add___: 加運算
    ___sub___: 減運算
    ___mul___: 乘運算
    ___mod___: 求餘運算
    ___pow___: 乘方

例:封裝一個更加標準化的Person,需求如下:
在建立物件時列印日誌
在物件銷燬時列印日誌
自定義物件的列印樣式
設法統計人的“長度”

# 封裝一個Person類,將與人有關的屬性、方法組合在一起,以便將來複用

class Person:
    # 初始預設的屬性
    name = "某某某"
    age = 0
    rmb = 0

    # 構造方法:外界建立類的例項時呼叫 ,構造方法是初始化例項屬性的最佳時機
    def __init__(self, name, age, rmb):
        print("__init__:我被建立了")
        self.name = name
        self.age = age
        self.rmb = rmb

    # 析構方法,在物件被刪除時呼叫
    def __del__(self):
        print("__del__:我被刪除了")

    # 在物件被列印時,提供一個供列印的字串
    def __str__(self):
        return "{name:%s;age:%d;rmb:%.2f}" % (self.name, self.age, self.rmb)

    # 返回物件的長度,如何計算長度是自定義的
    def __len__(self):
        return int(self.rmb)

    # 比較當前例項是否大於另一個同類的other例項,比較方法自定義
    def __gt__(self, other):
        if self.rmb > other.rmb:
            return True
        else:
            return False

    # 定義與另一個例項相加的結果
    def __add__(self, other):
        return Person(self.name + "-" + other.name, min(self.age, other.age), self.rmb + other.rmb)

    # 定義與另一個例項相減的結果
    def __sub__(self, other):
        return Person(self.name + "VS" + other.name, self.age+other.age, abs(self.rmb - other.rmb))

    # 定義與另一個例項相乘的結果
    def __mul__(self, other):
        print("相乘")
        return self

    # 定義對另一個物件求模的結果
    def __mod__(self, other):
        print("取餘")
        return other

    # 自我介紹方法
    # self = 類的例項
    def tell(self):
        print("我是%s,我%d歲了,我有存款%.2f萬元" % (self.name, self.age, self.rmb))

建立物件,並執行列印、比較、運算等操作

 # 建立Person類的例項,程式開始時例項物件會被系統建立,會呼叫物件的__init__方法,多少個例項,呼叫多少次
p1 = Person("易阿天", 60, 500)
p2 = Person("林阿華", 20, 10)

# 呼叫例項方法
p1.tell()

# 呼叫__str__方法列印物件
print(p1,p2)

# 呼叫__len__方法求物件長度
print(len(p1))

# 呼叫__gt__方法進行比較操作
print(p1 > p2)

# 呼叫__add__方法進行加操作,使用此類操作,會建立一個新物件,再次會短暫呼叫__str__和__del__方法,
print(p1 + p2)

# 呼叫__sub__方法進行加操作,同上會建立新物件
print(p1 - p2)

# 呼叫__mul__方法進行加操作,同上會建立新物件
print(p1 * p2)

# 呼叫__mod__方法進行加操作,同上會建立新物件
print(p1 % p2)

# 程式結束時例項物件會被系統銷燬,會呼叫物件的__del__方法,多少個例項,呼叫多少次

執行結果:
在這裡插入圖片描述在這裡插入圖片描述在這裡插入圖片描述

  • 專有方法__repr__與__str__

__repr__ 是代表的意思,與 __str__ 功能相似,都是返回字串。
當我們呼叫print()時,列印一個字串時,優先使用的是 __str__ 方法返回的字串如果未定義則使用 __repr__ 方法;
但是如果是在終端直接輸出時,則直接使用 __repr__ 方法返回的字串;

例:在控制檯中
在這裡插入圖片描述

正常來說,在IDE中,我們要列印a的值,要使用 print(a) ,直接 a 是打印不出來的,但在控制檯上卻可以。此時的a,的值就是從 __repr__ 裡獲得的,而且只能從這裡獲得。

例:在pycharm中
新建一個文件檔案,這裡自定義一個名字為“MyRepr”

# 定義一個person類
class Person:
    # 定義一個構造方法
    def __init__(self,name,age):
        self.name = name
        self.age = age

    def __str__(self):
        return "sPerson{name:%s,age:%d}"%(self.name,self.age)

    #定義一個__repr__的方法,這個方法在這裡只是__str__的備用,當沒有時才會呼叫
    def __repr__(self):
        return "rPerson{name:%s,age:%d}"%(self.name,self.age)

if __name__ == '__main__':
    # 建立一個p物件
    p = Person("bill",60)
    print(p)

執行結果:
在這裡插入圖片描述
如果使用控制檯執行此文件,結果卻不一樣,因為控制檯 print( p )會找 __str__ 方法,但p只找 __repr__ 方法
在這裡插入圖片描述

類的繼承與多繼承

  • 類的繼承
    例:人與壞蛋

    繼承人(Person)實現一個壞蛋類,用以儲存壞蛋的資訊
    壞蛋擁有人的一切正常人的屬性和功能
    壞蛋有【惡習】屬性和【作惡】方法
    建立一個壞蛋,為其設定其基本資訊和惡習
    令其作惡

#這是上節課關於人(Person)這個類的程式碼,這裡重寫一次並試著封裝在myPerson.py模組中。
class Person:
   #人的預設屬性和值
    name = "某某某"
    age = 1
    rmb = 0
  
   #人類被建立 # 構造方法,人類被建立初始化例項
    def __init__(self,name,age,rmb):
        print("__init__的方法被呼叫了")
        self.name = name
        self.age = age
        self.rmb = rmb

    # 人類會的方法-自我介紹
    def tell(self):
        print("我是%s,我%d歲了,我有存款%.2f萬元"%(self.name,self.age,self.rmb))

開始繼承…

# 匯入父類
from myPerson import Person

#定義一個壞蛋類,繼承於人類,因為壞蛋也是人
class Bastard(Person):
    # 此時什麼都不寫,也已經具有了父類的所有預設屬性和自我介紹的方法
    
    #  定義一個壞蛋特有的屬性‘作惡’,預設為空
    badHobby = None
    
    # 覆寫和父類的構造方法
    def __init__(self, name, age, rmb, badHobby):
        # 呼叫父類構造方法實現name,age,rmb的設定
        super().__init__(name, age, rmb)
        print("__init__:壞蛋自己初始化了")
        self.badHobby = badHobby

    # 覆寫父類的自我介紹方法
    def tell(self):
        super().tell()
        #自己的自我介紹方法
        print("勞資乃%s,此路是我開,此樹是我栽,要想從此過,留下買路財"%(self.name))
        
    # 特有方法:作惡
    def doBadThings(self):
        print("老子專好%s" % (self.badHobby))
# 建立壞人例項:
b = Bastard("李逵", 3, 0.01, "喝酒殺人")
b.tell()
b.doBadThings()

執行結果:
在這裡插入圖片描述

修改器與獲取器
例:引用回上面的例子,人與壞蛋

# 匯入父類
from myPerson import Person

# 繼承於Person類
class Bastard(Person):
    #  特色屬性:惡習
    badHobby = None
    
    # 覆寫和父類的構造方法
    def __init__(self, name, age, rmb, badHobby):
        super().__init__(name, age, rmb)
        print("__init__:壞蛋自己初始化了")
        self.badHobby = badHobby

    # 覆寫父類方法
    def tell(self):
        super().tell()
        print("勞資乃%s,此路是我開,此樹是我栽,要想從此過,留下買路財"%(self.name))

    # 設定器,用於修改self.badHobby
    def setBadHobby(self, badHobby):
        self.badHobby = badHobby

    # 獲取器
    def getBadHobby(self):
        return self.badHobby

    # 特有方法:作惡
    def doBadThings(self):
        print("老子專好%s" % (self.badHobby))
#建立例項
b = Bastard("李逵", 3, 0.01, "喝酒殺人")

#修改壞蛋的作惡內容
b.setBadHobby("搶奪財物")
b.tell()
b.doBadThings()

執行結果:
在這裡插入圖片描述

  • 多繼承

概述
在Python中,一個類可以同時繼承於多個類;
如果這些父類的成員之間相互沒有衝突,那當然沒有問題;
但如果這些父類中存在相同的成員(屬性、方法),特別是相同的方法時,就會存在“我到底繼承誰的?!”這樣的疑問;
答案是,繼承時【誰的次序在前,就優先繼承誰】

例:Gay,Man Or Woman,需求如下:
封裝男人類,繼承於Person ,使之有陽剛風格的自我介紹,使之能咆哮
封裝女人類,繼承於Person,使之有陰柔風格的自我介紹,使之能撒嬌
封裝Gay類,使之同時具有男人和女人的特性
令其咆哮,令其撒嬌
令其偏陽剛地進行自我介紹
令其偏陰柔地進行自我介紹

# 匯入父類
from myPerson import Person

#定義男人,繼承於‘人’這個父類
class Man(Person):
    #自我介紹方法,Man繼承了Person,它的tell是陽剛的
    def tell(self):
        print("勞資乃%s,勞資%d歲了,勞資有存款%.2f"%(self.name,self.age,self.rmb))
        
    #男人的咆嘯方法
    def roar(self):
        print("嗷!勞資天下第一!")

#定義女人,繼承於‘人’這個父類
class Woman(Person):
   #自我介紹方法,Woman繼承了Person,它的tell是陰柔的
    def tell(self):
        print("倫家乃%s,倫家%d歲了,倫家有存款%.2f"%(self.name,self.age,self.rmb))

   #女人的撒嬌方法
    def sajiao(self):
        print("好討厭了啦!")

#定義一個GAY,同時繼承於男人和女人
class Gay(Woman,Man):
    # 什麼都不寫,都已經具有了Man和Woman的全部屬性和方法

    pass
#建立一個男人例項
m = Man("史泰龍",40,10000)
m.tell()
m.roar()

#建立一個女人例項
w = Woman("鳳姐",30,10000)
w.tell()
w.sajiao()

執行結果:
在這裡插入圖片描述
如果現在建立一個GAY的例項,同時繼承於男人和女人,當然它都已經具有了Man和Woman的全部屬性和方法,可以咆嘯,也可以撒嬌,那問題來了,自我介紹的方法應該用男人的還是女人的?

#建立GAY例項
g = Gay("庫克",50,100000000000)
g.tell()
g.roar()
g.sajiao()

執行結果:
在這裡插入圖片描述

多繼承,可以同時繼承Man和Woman的衣鉢,但對於同名方法,在前的類具有更高的優先順序,Woman繼承了Person,它的tell是陰柔的,如果想要讓Gay變得更Man而不是更Woman,只需要調整其繼承順序即可

類的多型

動態繫結,指的是當呼叫一個子類例項的父類方法時,系統能夠自動識別和呼叫【該子類自身對父類方法的實現】

例:軍隊,需求說明:
為帝國建立一支軍隊,包含騎兵、弓箭手、法師
所有兵種都能夠進攻和防守,但形態各異
通過輸入將令,控制每個兵種的攻守細節

#士兵有很多種類,所有兵種都能攻守且形態各異,我們為其定義共同父類——戰士類Soldier
class Soldier:
    # 進攻方法
    def attack(self):
        print("士兵進攻")

    # 防守方法
    def defend(self):
        print("士兵防守")

#接下來定義各種不同形態的子類(多型),對攻防細節做不同實現

# 騎兵類 (繼承於戰士類)
class Calvary(Soldier):
    def attack(self):
        print("騎兵使用了鐵蹄碾壓")

    def defend(self):
        print("騎兵防守")

# 弓箭手類 (繼承於戰士類)
class Archer(Soldier):
    def attack(self):
        print("弓箭手使用了萬箭齊射")

    def defend(self):
        print("弓箭手防守")

# 法師類 (繼承於戰士類)
class Master(Soldier):
    def attack(self):
        print("法師使用了魔法火焰")

    def defend(self):
        print("法師防守")
# 建立一支軍隊列表
kingsArmy = []

# 建立不同兵種的戰士例項
c = Calvary()
a = Archer()
m = Master()

# 應徵入伍,加入列表
kingsArmy.append(c)
kingsArmy.append(a
            
           

相關推薦

面向物件

文章目錄 第一節:關於類 ==面向物件== ==類的封裝== ==類的私有成員== ==類的專有方法== ==類的繼承與多繼承== ==類的多型== ==靜態方法和類方法==

Python入門筆記—面向物件之OOP)

第六章:面向物件之OOP 1.面向物件的概述(Object Oriented,OO) 1.1 名詞解釋 OO(Object Oriented):面向物件 OOA(Object Oriented Analysis):面向物件的分析 OOD(Object Oriente

面向物件基礎

1. 面向物件可以幫助我們從巨集觀上把握、從整體上分析整個系統。 但是具體到實現部分的微觀操作(就是一個個方法),仍然需要面向過程的思路去處理。 2. 類可以看成一類物件的模板,物件可以看成該類的一個具體例項。 3. 對於一個類來說,一般有三種常見的成員:屬性field、方法method、構造器const

【javascript高階程式設計】讀書摘錄3 面向物件

第六章、面向物件的程式設計     這一章應該是Javascript中最抽象的一章,其中原型、原型鏈、建構函式等多次出現,幾乎貫穿了整個章節。而對於建立物件和繼承,也都是基於原型和建構函式而來的。因此這一部分的內容需要細細琢磨。尤其是對於原型、原型鏈,應該多畫圖,加深理解。

“全棧2019”Java三十五面向物件

難度 初級 學習時間 10分鐘 適合人群 零基礎 開發語言 Java 開發環境 JDK v11 IntelliJ IDEA v2018.3 文章原文連結 “全棧2019”Java第三十五章:面向物件 下一章 “全棧2019”Java第三十六章:類 學習小組 加入同步

面向對象1

沒有 值傳遞 默認 封裝性 軟件開發 大型項目 語句 開發思想 實現 面向對象和面向過程的區別 兩者都是軟件開發思想,先有面向過程,後有面向對象。在大型項目中,針對面向過程的不足推出了面向對象開發思想。區別1. 編程思路不同: 面向過程以實現功能的函數開發為主,而面向對象要

異常機制

() 不同 finall try arr 運行時 運行 ror 則無 第六章:異常機制 異常的定義 異常:在程序運行過程中出現的意外事件,導致程序中斷執行。 異常處理 try...catch 語法:try{ //可能出現異常的代碼}catch(異常類型 異常對象名){

循環結構(二)

結構 不執行 三種 表達式 成了 不改變 條件 運算符 步驟 第六章:循環結構(二) 一. for 循環 1.循環結構的四個組成部分 (1). 初始部分:設置循環的初始狀態,比如我們設置記錄循環次數的變量 i 為 0 . (2). 循環體:重復執行的代碼 .

需求評審如何進行

角色 來源 職責 介紹 技術 產品介紹 好的 通過 協調 前言今天我們講的需求評審包括兩個部分,需求過濾和需求評審。 需求過濾 1.需求分析不是所有需求都要做進產品,我們要根據公司和產品的定位,進行合適地分析和過濾。 我們需要分析出用戶需求所對應的本質,將其轉化為產品能夠提

Node入門教程(8)path 模塊詳解

format QQ 調用 保留 微軟 posix interface join 結果 path 模塊詳解 path 模塊提供了一些工具函數,用於處理文件與目錄的路徑。由於windows和其他系統之間路徑不統一,path模塊還專門做了相關處理,屏蔽了彼此之間的差異。 可移

Docker | 構建私有倉庫

推送 sun 指定 公司 網絡環境 add 屬性 提示 回收機制 前言 上一章節,講解了利用Dockerfile和commit進行自定義鏡像的構建。大部分時候,公司運維或者實施部門在構建了符合公司業務的鏡像環境後,一般上不會上傳到公共資源庫的。這就需要自己搭建一個私有倉庫

編寫安全應用

利用 flash 網站 這一 ade 第六章 用戶數據 ack else 很多時候,安全應用是以犧牲復雜度(以及開發者的頭痛)為代價的。Tornado Web服務器從設計之初就在安全方面有了很多考慮,使其能夠更容易地防範那些常見的漏洞。安全cookies防止用戶的本地狀態被

《JAVA多線程編程核心技術》 筆記單例模式與多線程

會有 isp left sync con 多線程編程 鎖機制 數據 range 一、立即加載/"餓漢模式"和延遲加載/"懶漢模式" 立即加載(又稱餓漢模式):在使用類的時候已經將對象創建完畢,常見實現方法是直接new實例化 延遲加載(又稱懶漢模式):在調用get

隨機化

gin fat 偽隨機數發生器 偽隨機 運行 合成 內嵌 想要 ini 隨著設計變得越來越復雜,要想產生一個完整的激勵集來測試設計的功能也變得越來越困難。采用受約束的隨機測試法(CRT)自動產生測試集是目前的一種主要的方法。CRT由兩部分組成:使用隨機的數據流為DUT產生

隨機化(續1)

限制 調試 each 範圍 實例 func 文件中 約束 hand 6.6 pre_randomize和post_randomize函數 我們在調用randomize()函數之前或者之後要立即執行一些操作。比如,在隨機化之前可能要設置類裏的一些非隨機變量(上下限、權重),或

隨機化(續2)

重要 之間 ilog -o bbbb 動態 調試 即使 不同 6.10 隨機化句柄數組 如果想要產生多個隨機對象,那麽你可能需要建立隨機句柄數組,和整數數組不同,隨機求解器不會創建對象,所以你需要在隨機化前分配所有的元素。 動態數組可以按照需要分配最大數量的元素,然後按照約

Android群英傳知識點回顧——Android繪圖機制與處理技巧

ride ets 常用 結合 管理 一個 sla 浮雕效果 調用 6.1 屏幕的尺寸信息 6.1.1 屏幕參數 6.1.2 系統屏幕密度 6.1.3 獨立像素密度dp 6.1.4 單位轉換 6.2 2D繪圖基礎 6.3 Android X

數據挖掘項目完整應用案例演示

分析師 過程 6.2 需求分析 不同 反饋 數據挖掘 分析報告 6.4 6.1項目背景和業務分析需求的提出 ...... 6.2數據分析師參與需求討論 針對需求收集相關的背景數據和指標,熟悉業務相關邏輯 從數據分析的專業角度評價初步的業務分析需求是否合理,是否可行 6.

C#本質論6.0繼承

行為 實體 sta 密封類 類型 繼承鏈 tac 預測 兩個類 基類型與派生類型之間的轉型: 顯式轉型與隱式轉型: 從派生類型轉型為基類型稱為隱式轉型,轉型總會成功,不會引發異常。 從基類型轉型為派生類型稱為顯式轉型,在轉型過程中可能會失敗,為了執行顯示轉型,要在原始引用名

Introduction to 3D Game Programming with DirectX 12 學習筆記之 --- 在Direct3D中繪製

程式碼工程地址: https://github.com/jiabaodan/Direct12BookReadingNotes 學習目標 熟悉Direct3D介面的定義,儲存和繪製幾何資料 ; 學習編寫基本的頂點和畫素著色器; 學習使用渲染流水線狀態