Python 基礎(chǔ)入門(mén) 5--面向?qū)ο?/h1>

Python 基礎(chǔ)入門(mén)前四篇:

第五篇主要介紹 Python 的面向?qū)ο蠡A(chǔ)知識(shí)圈膏,也就是類(lèi)的介紹绘搞,包括類(lèi)方法和屬性晌纫、構(gòu)造方法锌雀、方法重寫(xiě)、繼承等翰绊,最后給出兩道簡(jiǎn)單的練習(xí)題佩谷。


5.面向?qū)ο?/h3>

5.1 簡(jiǎn)介

先簡(jiǎn)單介紹一些名詞概念。

  • 類(lèi):用來(lái)描述具有相同的屬性和方法的對(duì)象的集合监嗜。它定義了該集合中每個(gè)對(duì)象所共有的屬性和方法谐檀。對(duì)象是類(lèi)的實(shí)例。
  • 類(lèi)方法:類(lèi)中定義的函數(shù)秤茅。
  • 類(lèi)變量:類(lèi)變量在整個(gè)實(shí)例化的對(duì)象中是公用的稚补。類(lèi)變量定義在類(lèi)中且在函數(shù)體之外童叠。類(lèi)變量通常不作為實(shí)例變量使用框喳。
  • 數(shù)據(jù)成員:類(lèi)變量或者實(shí)例變量用于處理類(lèi)及其實(shí)例對(duì)象的相關(guān)的數(shù)據(jù)。
  • 方法重寫(xiě):如果從父類(lèi)繼承的方法不能滿(mǎn)足子類(lèi)的需求厦坛,可以對(duì)其進(jìn)行改寫(xiě)五垮,這個(gè)過(guò)程叫方法的覆蓋(override),也稱(chēng)為方法的重寫(xiě)杜秸。
  • 局部變量:定義在方法中的變量放仗,只作用于當(dāng)前實(shí)例的類(lèi)。
  • 實(shí)例變量:在類(lèi)的聲明中撬碟,屬性是用變量來(lái)表示的诞挨。這種變量就稱(chēng)為實(shí)例變量,是在類(lèi)聲明的內(nèi)部但是在類(lèi)的其他成員方法之外聲明的呢蛤。
  • 繼承:即一個(gè)派生類(lèi)(derived class)繼承基類(lèi)(base class)的字段和方法惶傻。繼承也允許把一個(gè)派生類(lèi)的對(duì)象作為一個(gè)基類(lèi)對(duì)象對(duì)待。例如其障,有這樣一個(gè)設(shè)計(jì):一個(gè) Dog 類(lèi)型的對(duì)象派生自 Animal 類(lèi)银室,這是模擬"是一個(gè)(is-a)"關(guān)系(例圖,Dog 是一個(gè) Animal)励翼。
  • 實(shí)例化:創(chuàng)建一個(gè)類(lèi)的實(shí)例蜈敢,類(lèi)的具體對(duì)象。
  • 對(duì)象:通過(guò)類(lèi)定義的數(shù)據(jù)結(jié)構(gòu)實(shí)例汽抚。對(duì)象包括兩個(gè)數(shù)據(jù)成員(類(lèi)變量和實(shí)例變量)和方法抓狭。

Python中的類(lèi)提供了面向?qū)ο缶幊痰乃谢竟δ埽?strong>類(lèi)的繼承機(jī)制允許多個(gè)基類(lèi),派生類(lèi)可以覆蓋基類(lèi)中的任何方法造烁,方法中可以調(diào)用基類(lèi)中的同名方法否过。

對(duì)象可以包含任意數(shù)量和類(lèi)型的數(shù)據(jù)狱从。

5.2 類(lèi)定義

下面是簡(jiǎn)單定義一個(gè)類(lèi):

# 定義一個(gè)動(dòng)物類(lèi)別
class Animal(object):
    # 類(lèi)變量
    eat = True
    
    def __init__(self, name, gender):
        self.name = name
        self.gender = gender

     # 類(lèi)方法
    def run(self):
        return 'Animal run!'
# 實(shí)例化類(lèi)
anm = Animal('animal', 'male')

# 訪問(wèn)類(lèi)的屬性和方法
print("Animal 類(lèi)的屬性 eat 為:", anm.eat)
print("Animal 類(lèi)的方法 run 輸出為:", anm.run())

輸出結(jié)果:

Animal 類(lèi)的屬性 eat 為: True
Animal 類(lèi)的方法 run 輸出為: Animal run!

上述是一個(gè)簡(jiǎn)單的類(lèi)的定義,通常一個(gè)類(lèi)需要有關(guān)鍵字 class 叠纹,然后接一個(gè)類(lèi)的名字季研,然后如果是 python2.7 是需要如例子所示加上圓括號(hào)和 object ,但在 python3 版本中誉察,其實(shí)可以直接如下所示:

class Animal:
構(gòu)造方法和特殊參數(shù) self 的表示

然后 __init__構(gòu)造方法与涡,即在進(jìn)行類(lèi)實(shí)例化的時(shí)候會(huì)調(diào)用該方法,也就是 anm = Animal('animal', 'male')持偏。

此外驼卖,對(duì)于類(lèi)的方法,第一個(gè)參數(shù)也是必須帶上的參數(shù)鸿秆,按照慣例名稱(chēng)是 self 酌畜,它代表的是類(lèi)的實(shí)例,也就是指向?qū)嵗旧淼囊们溥矗寣?shí)例本身可以訪問(wèn)類(lèi)中的屬性和方法桥胞。如下代碼所示:

class Test:
    def prt(self):
        print(self)
        print(self.__class__)
 
t = Test()
t.prt()

輸出結(jié)果:

<__main__.Test object at 0x000002A262E2BA20>
<class '__main__.Test'>

可以看到 print(self) 的結(jié)果是輸出當(dāng)前對(duì)象的地址,而 self.__class__ 表示的就是類(lèi)考婴。

剛剛說(shuō)了 self 只是慣例取的名稱(chēng)贩虾,換成其他名稱(chēng)也可以,如下所示:

# 不用 self 名稱(chēng)
class Test2:
    def prt(sss):
        print(sss)
        print(sss.__class__)

t2 = Test2()
t2.prt()

輸出結(jié)果是一樣的沥阱,類(lèi)實(shí)例的地址改變了而已缎罢。

<__main__.Test2 object at 0x000001FB7644BBA8>
<class '__main__.Test2'>
類(lèi)方法

類(lèi)方法和構(gòu)造方法一樣,首先是關(guān)鍵字 def 考杉,接著就是參數(shù)第一個(gè)必須是 self 策精,表示類(lèi)實(shí)例的參數(shù)。

#類(lèi)定義
class people:
    #定義基本屬性
    name = ''
    age = 0
    #定義私有屬性,私有屬性在類(lèi)外部無(wú)法直接進(jìn)行訪問(wèn)
    __weight = 0
    #定義構(gòu)造方法
    def __init__(self,n,a,w):
        self.name = n
        self.age = a
        self.__weight = w
    def speak(self):
        print("%s 說(shuō): 我 %d 歲崇棠。" %(self.name,self.age))
 
# 實(shí)例化類(lèi)
p = people('runoob',10,30)
p.speak()

輸出結(jié)果

runoob 說(shuō): 我 10 歲咽袜。

5.3 繼承

繼承的語(yǔ)法定義如下:

class DerivedClassName(BaseClassName1,BaseClassName2,...):
    <statement-1>
    .
    .
    .
    <statement-N>

需要注意:

  • 圓括號(hào)中基類(lèi)的順序,當(dāng)基類(lèi)含有相同方法名易茬,子類(lèi)沒(méi)有指定(即類(lèi)似 BaseClass1.method1())酬蹋,python 會(huì)從左到右搜索繼承的基類(lèi)是否包含該方法;
  • 基類(lèi)和子類(lèi)必須定義在一個(gè)作用域內(nèi)抽莱;

下面給出一個(gè)代碼例子范抓,基類(lèi)定義還是上一節(jié)中的 people 類(lèi)別,這次定義一個(gè)子類(lèi) student

# 單繼承示例
class student(people):
    grade = ''

    def __init__(self, n, a, w, g):
        # 調(diào)用父類(lèi)的構(gòu)造方法
        people.__init__(self, n, a, w)
        self.grade = g

    # 覆寫(xiě)父類(lèi)的方法
    def speak(self):
        print("%s 說(shuō): 我 %d 歲了食铐,我在讀 %d 年級(jí)" % (self.name, self.age, self.grade))


s = student('ken', 10, 60, 3)
s.speak()

輸出結(jié)果

ken 說(shuō): 我 10 歲了匕垫,我在讀 3 年級(jí)

這是一個(gè)單繼承,即繼承一個(gè)基類(lèi)的示例虐呻,子類(lèi)的構(gòu)造方法必須先調(diào)用基類(lèi)(父類(lèi))的構(gòu)造方法:

# 調(diào)用父類(lèi)的構(gòu)造方法
people.__init__(self, n, a, w)

另一種調(diào)用基類(lèi)的構(gòu)造方法象泵,利用 super() 函數(shù):

super.__init__(self, n, a, w)
方法重寫(xiě)

上述例子還重寫(xiě)了基類(lèi)的方法 speak()寞秃。

方法重寫(xiě)是在基類(lèi)的方法無(wú)法滿(mǎn)足子類(lèi)的需求時(shí),在子類(lèi)重寫(xiě)父類(lèi)的方法偶惠。

多繼承

python 也支持多繼承春寿,下面是一個(gè)例子,繼續(xù)沿用剛剛定義的一個(gè)類(lèi) student 忽孽,然后再重新定義一個(gè)基類(lèi) speaker

#另一個(gè)類(lèi)绑改,多重繼承之前的準(zhǔn)備
class speaker():
    topic = ''
    name = ''
    def __init__(self,n,t):
        self.name = n
        self.topic = t
    def speak(self):
        print("我叫 %s,我是一個(gè)演說(shuō)家兄一,我演講的主題是 %s"%(self.name,self.topic))
 
#多重繼承
class sample(speaker,student):
    a =''
    def __init__(self,n,a,w,g,t):
        student.__init__(self,n,a,w,g)
        speaker.__init__(self,n,t)
 
test = sample("Tim",25,80,4,"Python")
test.speak()   #方法名同厘线,默認(rèn)調(diào)用的是在括號(hào)中排前地父類(lèi)的方法

輸出結(jié)果:

我叫 Tim,我是一個(gè)演說(shuō)家出革,我演講的主題是 Python

而如果想指定任意父類(lèi)的方法造壮,可以添加下面這段代碼:

# 顯示調(diào)用 student 父類(lèi)的 speak 方法
def speak(self):
    super(student, self).speak()

上面介紹過(guò)了, super() 函數(shù)是調(diào)用父類(lèi)的一個(gè)方法骂束,可以直接 super().method() 耳璧,但如果是多繼承并且指定父類(lèi)的話(huà),就如上述所示栖雾,添加父類(lèi)名字以及 self 來(lái)表示類(lèi)實(shí)例楞抡。

另外伟众,python2.7 調(diào)用 super() 方法析藕,也需要傳入父類(lèi)名字和 self 兩個(gè)參數(shù)。

5.4 類(lèi)屬性與方法

屬性和方法的訪問(wèn)權(quán)限凳厢,即可見(jiàn)性账胧,有三種,公開(kāi)先紫、受保護(hù)以及私有治泥,私有方法和私有屬性如下定義:

  • 類(lèi)的私有屬性:兩個(gè)下劃線(xiàn)開(kāi)頭,聲明該屬性私有遮精,不能在類(lèi)的外部被使用或直接訪問(wèn)居夹,而在類(lèi)內(nèi)部的方法中使用時(shí):self.__private_attrs

  • 類(lèi)的私有方法:兩個(gè)下劃線(xiàn)開(kāi)頭,聲明該方法為私有方法本冲,只能在類(lèi)的內(nèi)部調(diào)用 准脂,不能在類(lèi)的外部調(diào)用。self.__private_methods檬洞。

而如果是受保護(hù)的屬性或者方法狸膏,則是一個(gè)下劃線(xiàn)開(kāi)頭,例如 _protected_attr 添怔。

下面是一個(gè)簡(jiǎn)單的示例:

class JustCounter:
    __secretCount = 0  # 私有變量
    publicCount = 0  # 公開(kāi)變量

    def count(self):
        self.__secretCount += 1
        self.publicCount += 1
        print(self.__secretCount)
        self.__count()

    def __count(self):
        print('私有方法')


counter = JustCounter()
counter.count()
counter.count()
print(counter.publicCount)
print(counter.__secretCount)  # 報(bào)錯(cuò)湾戳,實(shí)例不能訪問(wèn)私有變量
print(counter.__count())

輸出結(jié)果

1
私有方法
2
私有方法
2

調(diào)用私有屬性會(huì)報(bào)錯(cuò):

AttributeError: 'JustCounter' object has no attribute '__secretCount'

調(diào)用私有方法會(huì)報(bào)錯(cuò):

AttributeError: 'JustCounter' object has no attribute '__count'

類(lèi)的屬性不僅可以是變量贤旷,也可以是類(lèi)實(shí)例作為一個(gè)屬性,例子如下所示:

class TimeCounter:
    def __init__(self):
        print('timer')


class JustCounter:
    __secretCount = 0  # 私有變量
    publicCount = 0  # 公開(kāi)變量

    def __init__(self):
        self.timer = TimeCounter()

    def count(self):
        self.__secretCount += 1
        self.publicCount += 1
        print(self.__secretCount)
        self.__count()

    def __count(self):
        print('私有方法')


counter = JustCounter()
counter.count()
counter.count()
print(counter.publicCount)

同樣繼續(xù)采用 JustCounter 類(lèi)砾脑,只是新定義 TimeCounter 幼驶,并在 JustCounter 調(diào)用構(gòu)造方法,實(shí)例化一個(gè) TimeCounter 類(lèi)韧衣,輸出結(jié)果:

timer
1
私有方法
2
私有方法
2

5.5 練習(xí)

最后是來(lái)自 Python-100-Days--Day08面向?qū)ο蠡A(chǔ) 的兩道練習(xí)題:

定義一個(gè)簡(jiǎn)單的數(shù)字時(shí)鐘

這個(gè)例子將采用受保護(hù)的屬性县遣,即屬性名字以單下劃線(xiàn)開(kāi)頭,所以初始化的構(gòu)造方法如下:

from time import sleep


class Clock(object):
    """數(shù)字時(shí)鐘"""

    def __init__(self, hour=0, minute=0, second=0):
        '''
        初始化三個(gè)基本屬性汹族,時(shí)萧求,分,秒
        :param hour:
        :param minute:
        :param second:
        '''
        self._hour = hour
        self._minute = minute
        self._second = second

然后是模擬時(shí)鐘的運(yùn)行顶瞒,這里只需要注意時(shí)鐘運(yùn)行過(guò)程邊界問(wèn)題夸政,即秒和分都是每到 60 需要置零,并讓分或者時(shí)加 1榴徐,而時(shí)是每隔 24 需要進(jìn)行這樣的操作

 def run(self):
     '''
     模擬時(shí)鐘的運(yùn)行
     :return:
     '''
     self._second += 1
     if self._second == 60:
        self._second = 0
        self._minute += 1
        if self._minute == 60:
            self._minute = 0
            self._hour += 1
             if self._hour == 24:
                self._hour = 0

最后是顯示時(shí)間守问,需要注意時(shí)、分和秒三個(gè)屬性都是整數(shù)坑资,如果采用 % 進(jìn)行格式化耗帕,需要調(diào)用 str() 方法顯示將它們從整數(shù)變成字符串類(lèi)型,而如果用 format() 方法袱贮,就不需要仿便。

def show(self):
    '''
    顯示時(shí)間
    :return:
    '''
    print("{:02d}:{:02d}:{:02d}".format(self._hour, self._minute, self._second))

簡(jiǎn)單的運(yùn)用例子,這里調(diào)用 time.sleep() 方法攒巍,每顯示一次時(shí)間休眠一秒嗽仪,然后運(yùn)行,設(shè)置循環(huán)次數(shù)是 5 次柒莉。

# 簡(jiǎn)單時(shí)鐘例子
clock = Clock(23, 59, 57)
i = 0
while i < 5:
    clock.show()
    sleep(1)
    clock.run()
    i += 1

輸出結(jié)果:

23:59:57
23:59:58
23:59:59
00:00:00
00:00:01
定義一個(gè)類(lèi)描述點(diǎn)之間的移動(dòng)和距離

第二個(gè)練習(xí)是定義一個(gè)類(lèi)构蹬,描述平面上點(diǎn)之間的移動(dòng)和距離計(jì)算

首先是基本的構(gòu)造方法定義德频,這里作為平面上的點(diǎn)技竟,需要定義的屬性就是點(diǎn)的橫縱坐標(biāo):

# 定義描述平面上點(diǎn)之間的移動(dòng)和計(jì)算距離的類(lèi)
class Point(object):
    def __init__(self, x=0, y=0):
        '''
        初始的坐標(biāo)
        :param x:橫坐標(biāo)
        :param y:縱坐標(biāo)
        '''
        self._x = x
        self._y = y

接著睬捶,點(diǎn)的移動(dòng),可以有兩種實(shí)現(xiàn)跨蟹,第一種直接說(shuō)明目標(biāo)點(diǎn)的坐標(biāo):

def move_to(self, new_x, new_y):
    '''
    移動(dòng)到新的坐標(biāo)
    :param new_x:新的橫坐標(biāo)
    :param new_y:新的縱坐標(biāo)
    :return:
    '''
    self._x = new_x
    self._y = new_y

第二種則是只告訴分別在橫雳殊、縱兩個(gè)方向移動(dòng)的距離:

def move_by(self, dx, dy):
    '''
    移動(dòng)指定的增量
    :param dx:橫坐標(biāo)的增量
    :param dy:縱坐標(biāo)的增量
    :return:
    '''
    self._x += dx
    self._y += dy

然后計(jì)算點(diǎn)之間的距離方法,這里就需要用到剛剛從 math 庫(kù)導(dǎo)入的方法 sqrt 喷市,即求取平方根:

def distance(self, other):
    '''
    計(jì)算與另一個(gè)點(diǎn)的距離
    :param other:
    :return:
    '''
    x_dist = self._x - other._x
    y_dist = self._y - other._y
    return sqrt(x_dist ** 2 + y_dist ** 2)

最后當(dāng)然就是打印當(dāng)前點(diǎn)的坐標(biāo)信息了:

 def __str__(self):
     '''
     顯示當(dāng)前點(diǎn)坐標(biāo)
     :return:
     '''
     return '({},{})'.format(self._x, self._y)

簡(jiǎn)單的應(yīng)用例子

p1 = Point(10, 20)
p2 = Point(30, 5)
print('point1:', p1)
print('point2:', p2)
p1.move_to(15, 25)
print('after move to (15, 25), point1:', p1)
p1.move_by(20, 10)
print('move by (20, 10), point1:', p1)
dist = p1.distance(p2)
print('distance between p1 and p2: ', dist)

輸出結(jié)果:

point1: (10,20)
point2: (30,5)
after move to (15, 25), point1: (15,25)
move by (20, 10), point1: (35,35)
distance between p1 and p2:  30.4138126514911

參考:


小結(jié)

本文簡(jiǎn)單介紹 Python 面向?qū)ο蟮幕A(chǔ)內(nèi)容相种,主要是類(lèi)的定義、方法和屬性介紹,繼承和方法重寫(xiě)寝并,這些是比較基礎(chǔ)的內(nèi)容箫措,后續(xù)計(jì)劃的進(jìn)階內(nèi)容關(guān)于面向?qū)ο蟛糠郑€會(huì)繼續(xù)介紹如多態(tài)衬潦、裝飾器等內(nèi)容斤蔓。

此外,本文的代碼都上傳到我的 github 上了:

https://github.com/ccc013/Python_Notes/blob/master/Practise/class_example.py

歡迎關(guān)注我的微信公眾號(hào)--算法猿的成長(zhǎng)镀岛,或者掃描下方的二維碼弦牡,大家一起交流,學(xué)習(xí)和進(jìn)步漂羊!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者

  • 序言:七十年代末驾锰,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子走越,更是在濱河造成了極大的恐慌椭豫,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,590評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件旨指,死亡現(xiàn)場(chǎng)離奇詭異赏酥,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)谆构,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,157評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén)裸扶,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人搬素,你說(shuō)我怎么就攤上這事呵晨。” “怎么了蔗蹋?”我有些...
    開(kāi)封第一講書(shū)人閱讀 169,301評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵何荚,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我猪杭,道長(zhǎng),這世上最難降的妖魔是什么妥衣? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 60,078評(píng)論 1 300
  • 正文 為了忘掉前任皂吮,我火速辦了婚禮,結(jié)果婚禮上税手,老公的妹妹穿的比我還像新娘蜂筹。我一直安慰自己,他們只是感情好芦倒,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,082評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布艺挪。 她就那樣靜靜地躺著,像睡著了一般兵扬。 火紅的嫁衣襯著肌膚如雪麻裳。 梳的紋絲不亂的頭發(fā)上口蝠,一...
    開(kāi)封第一講書(shū)人閱讀 52,682評(píng)論 1 312
  • 那天,我揣著相機(jī)與錄音津坑,去河邊找鬼妙蔗。 笑死,一個(gè)胖子當(dāng)著我的面吹牛疆瑰,可吹牛的內(nèi)容都是我干的眉反。 我是一名探鬼主播,決...
    沈念sama閱讀 41,155評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼穆役,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼寸五!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起耿币,我...
    開(kāi)封第一講書(shū)人閱讀 40,098評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤播歼,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后掰读,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體秘狞,經(jīng)...
    沈念sama閱讀 46,638評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,701評(píng)論 3 342
  • 正文 我和宋清朗相戀三年蹈集,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了烁试。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,852評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡拢肆,死狀恐怖减响,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情郭怪,我是刑警寧澤支示,帶...
    沈念sama閱讀 36,520評(píng)論 5 351
  • 正文 年R本政府宣布,位于F島的核電站鄙才,受9級(jí)特大地震影響颂鸿,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜攒庵,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,181評(píng)論 3 335
  • 文/蒙蒙 一嘴纺、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧浓冒,春花似錦栽渴、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,674評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春墅冷,著一層夾襖步出監(jiān)牢的瞬間纯路,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,788評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工俺榆, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留感昼,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,279評(píng)論 3 379
  • 正文 我出身青樓罐脊,卻偏偏與公主長(zhǎng)得像定嗓,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子萍桌,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,851評(píng)論 2 361