1. 程式人生 > 實用技巧 >《隨便寫》一些小知識

《隨便寫》一些小知識

<1>獲取當前讀寫的位置

  在讀寫檔案的過程中,如果想知道當前的位置,可以使用tell()來獲取

  

   # 開啟一個已經存在的檔案
    f = open("test.txt", "r")
    str = f.read(3)
    print "讀取的資料是 : ", str

    # 查詢當前位置
    position = f.tell()
    print "當前檔案位置 : ", position

    str = f.read(3)
    print "讀取的資料是 : ", str

    # 查詢當前位置
    position = f.tell()
    print "當前檔案位置 : ", position

    f.close()

 

<2>定位到某個位置

如果在讀寫檔案的過程中,需要從另外一個位置進行操作的話,可以使用seek()

seek(offset, from)有2個引數

  • offset:偏移量
  • from:方向
    • 0:表示檔案開頭
    • 1:表示當前位置
    • 2:表示檔案末尾

demo:把位置設定為:從檔案開頭,偏移5個位元組

# 開啟一個已經存在的檔案
    f = open("test.txt", "r")
    str = f.read(30)
    print "讀取的資料是 : ", str

    # 查詢當前位置
    position = f.tell()
    print "當前檔案位置 : ", position

    # 重新設定位置
    f.seek(5,0)

    # 查詢當前位置
    position = f.tell()
    print "當前檔案位置 : ", position

    f.close()

  

demo:把位置設定為:離檔案末尾,3位元組處

  # 開啟一個已經存在的檔案
    f = open("test.txt", "r")

    # 查詢當前位置
    position = f.tell()
    print "當前檔案位置 : ", position

    # 重新設定位置
    f.seek(-3,2)

    # 讀取到的資料為:檔案最後3個位元組資料
    str = f.read()
    print "讀取的資料是 : ", str

    f.close()

  

1. 理解self

  • 所謂的self,可以理解為自己
  • 可以把self當做C++中類裡面的this指標一樣理解,就是物件自身的意思
  • 某個物件呼叫其方法時,python直譯器會把這個物件作為第一個引數傳遞給self,所以開發者只需要傳遞後面的引數即可

 

2.工廠方法模式

當買車時,有很多種品牌可以選擇,比如北京現代、別克、凱迪拉克、特斯拉等,那麼此時該怎樣進行設計呢?

# 定義一個基本的4S店類
class CarStore(object):

    #僅僅是定義了有這個方法,並沒有實現,具體功能,這個需要在子類中實現
    def createCar(self, typeName):
        pass

    def order(self, typeName):
        # 讓工廠根據型別,生產一輛汽車
        self.car = self.createCar(typeName)
        self.car.move()
        self.car.stop()

# 定義一個北京現代4S店類
class XiandaiCarStore(CarStore):

    def createCar(self, typeName):
        self.carFactory = CarFactory()
        return self.carFactory.createCar(typeName)


# 定義伊蘭特車類
class YilanteCar(object):

    # 定義車的方法
    def move(self):
        print("---車在移動---")

    def stop(self):
        print("---停車---")

# 定義索納塔車類
class SuonataCar(object):

    # 定義車的方法
    def move(self):
        print("---車在移動---")

    def stop(self):
        print("---停車---")

# 定義一個生產汽車的工廠,讓其根據具體得訂單生產車
class CarFactory(object):

    def createCar(self,typeName):
        self.typeName = typeName
        if self.typeName == "伊蘭特":
            self.car = YilanteCar()
        elif self.typeName == "索納塔":
            self.car = SuonataCar()

        return self.car

suonata = XiandaiCarStore()
suonata.order("索納塔")

  

定義了一個建立物件的介面(可以理解為函式),但由子類決定要例項化的類是哪一個,工廠方法模式讓類的例項化推遲到子類,抽象的CarStore提供了一個建立物件的方法createCar,也叫作工廠方法

子類真正實現這個createCar方法創建出具體產品。 建立者類不需要直到實際建立的產品是哪一個,選擇了使用了哪個子類,自然也就決定了實際建立的產品是什麼。

單例模式

確保某一個類只有一個例項,而且自行例項化並向整個系統提供這個例項,這個類稱為單例類,單例模式是一種物件建立型模式。

# 例項化一個單例
class Singleton(object):
    __instance = None

    def __new__(cls, age, name):
        #如果類數字能夠__instance沒有或者沒有賦值
        #那麼就建立一個物件,並且賦值為這個物件的引用,保證下次呼叫這個方法時
        #能夠知道之前已經建立過物件了,這樣就保證了只有1個物件
        if not cls.__instance:
            cls.__instance = object.__new__(cls)
        return cls.__instance

a = Singleton(18, "dongGe")
b = Singleton(8, "dongGe")

print(id(a))
print(id(b))

a.age = 19 #給a指向的物件新增一個屬性
print(b.age)#獲取b指向的物件的age屬性