• <noscript id="e0iig"><kbd id="e0iig"></kbd></noscript>
  • <td id="e0iig"></td>
  • <option id="e0iig"></option>
  • <noscript id="e0iig"><source id="e0iig"></source></noscript>
  • python 全棧開發,Day18(對象之間的交互,類命名空間與對象,實例的命名空間,類的組合用法)...

    python 全棧開發,Day18(對象之間的交互,類命名空間與對象,實例的命名空間,類的組合用法)

    一、對象之間的交互

    現在我們已經有一個人類了,通過給人類一些具體的屬性我們就可以拿到一個實實在在的人。
    現在我們要再創建一個狗類,狗就不能打人了,只能咬人,所以我們給狗一個bite方法。
    有了狗類,我們還要實例化一只實實在在的狗出來。
    然后人和狗就可以打架了。現在我們就來讓他們打一架吧!

    創建一個狗類

    class Person:
        role = 'person'  # 靜態屬性
    
        def __init__(self, name, sex, hp, ad):
            self.name = name  # 對象屬性 屬性
            self.sex = sex
            self.hp = hp
            self.ad = ad
    
        def attack(self):
            print('%s發起了一次攻擊' % self.name)
    
    class Dog:
        role = 'person'  # 靜態屬性
    
        def __init__(self, name, kind, hp, ad):
            self.name = name  # 對象屬性 屬性
            self.kind = kind
            self.hp = hp
            self.ad = ad
    
        def bite(self):
            print('%s咬了人一口' % self.name)
    
    
    alex = Person('a_sb', '不詳', 1, 5)
    boss_jin = Person('金老板', '女', 20, 50)
    
    teddy = Dog('笨笨', 'teddy', 50, 10)
    
    alex.attack()  # 相當于執行Person.attack(alex)
    boss_jin.attack()  # 相當于執行Person.attack(boss_jin)
    
    teddy.bite()
    

    執行輸出:

    a_sb發起了一次攻擊
    金老板發起了一次攻擊
    笨笨咬了人一口

     

    那么問題來了,人發起了一次攻擊,他攻擊了誰?

     

    交互 teddy打alex一下

    class Person:
        role = 'person'  # 靜態屬性
    
        def __init__(self, name, sex, hp, ad):
            self.name = name  # 對象屬性 屬性
            self.sex = sex
            self.hp = hp
            self.ad = ad
    
        def attack(self):
            print('%s發起了一次攻擊' % self.name)
    
    class Dog:
        role = 'person'  # 靜態屬性
    
        def __init__(self, name, kind, hp, ad):
            self.name = name  # 對象屬性 屬性
            self.kind = kind
            self.hp = hp
            self.ad = ad
    
        def bite(self,people): #people是變量名,它是一個對象
            people.hp -= self.ad #人掉血
            print('%s咬了%s一口,%s掉了%s點血' % (self.name,people.name,people.name,self.ad)) #由于people是對象,取name就是people.name
    
    
    alex = Person('a_sb', '不詳', 1, 5)
    boss_jin = Person('金老板', '女', 20, 50)
    
    teddy = Dog('笨笨', 'teddy', 50, 10)
    
    
    teddy.bite(alex) #alex是一個對象,把對象傳進去了
    print(alex.hp) #查看alex的血
    

    執行輸出:

    笨笨咬了a_sb一口,a_sb掉了10血
    -9

     

    再完善人攻擊狗的技能

    class Person:
        role = 'person'  # 靜態屬性
    
        def __init__(self, name, sex, hp, ad):
            self.name = name  # 對象屬性 屬性
            self.sex = sex
            self.hp = hp
            self.ad = ad
    
        def attack(self,dog):
            dog.hp -= self.ad
            print('%s攻擊了%s,%s掉了%s點血' % (self.name,dog.name,dog.name,self.ad))
    
    class Dog:
        role = 'person'  # 靜態屬性
    
        def __init__(self, name, kind, hp, ad):
            self.name = name  # 對象屬性 屬性
            self.kind = kind
            self.hp = hp
            self.ad = ad
    
        def bite(self,people): #people是變量名,它是一個對象
            people.hp -= self.ad #人掉血
            print('%s咬了%s一口,%s掉了%s點血' % (self.name,people.name,people.name,self.ad)) #由于people是對象,取name就是people.name
    
    
    alex = Person('a_sb', '不詳', 1, 5)
    boss_jin = Person('金老板', '女', 20, 50)
    
    teddy = Dog('笨笨', 'teddy', 50, 10)
    
    teddy.bite(alex) #alex是一個對象,把對象傳進去了
    print(alex.hp) #查看alex的血
    
    alex.attack(teddy)
    print(teddy.hp) #查看teddy的血
    

    執行輸出:

    笨笨咬了a_sb一口,a_sb掉了10點血
    -9
    a_sb攻擊了笨笨,笨笨掉了5點血
    45

     

    這款游戲,還可以豐富一點,比如玩家有4個技能,可以選擇

    等學了模塊,可以做隨機事件
    比如暴擊,中毒,每秒掉血等等...

     

    交互到這里就說完了
    方法可以傳參,參數可以是對象。

    交互: 人和狗的互相殘殺
    類中的方法的傳參與調用

     

    二、類命名空間與對象、實例的命名空間

    創建一個類就會創建一個類的名稱空間,用來存儲類中定義的所有名字,這些名字稱為類的屬性

    而類有兩種屬性:靜態屬性和動態屬性

    • 靜態屬性就是直接在類中定義的變量
    • 動態屬性就是定義在類中的方法

    其中類的數據屬性是共享給所有對象的

    而類的動態屬性是綁定到所有對象的

    創建一個對象/實例就會創建一個對象/實例的名稱空間,存放對象/實例的名字,稱為對象/實例的屬性

    在obj.name會先從obj自己的名稱空間里找name,找不到則去類中找,類也找不到就找父類...最后都找不到就拋出異常

     

    上面的例子,看下面2句話

    alex = Person('a_sb', '不詳', 1, 5)
    alex.attack(teddy)

    有一個問題
    alex是如何找到Person類的?

    因為是Person是實例化了alex,那么實例化過程中,發生了什么呢?

    查看對象的屬性

    print(alex.__dict__)

    {'hp': -9, 'sex': '不詳', 'name': 'a_sb', 'ad': 5}

     

     昨天的內容講到,調用屬性,需要__dict__中存在,才可以以調用

     那這....

     

    在面向過程中,代碼執行時從上向下執行

    類并不是完全這樣執行的,有些步驟跳過了。

     

    直接Person.role 就可以調用類表里

    print(Person.role)
    

    執行輸出:person


    所以說類里面的 方法,在實例化之前,就已經加載到內存中了

    類代碼執行,會跳過某些步驟
    類是感知不到它有多少個方法
    每當實例化之后,對象和類是單向關系,只能是對象取找類

     

    看下面一張圖

     

    代碼執行順序:

    1.加載類名Person

    2.加載類靜態屬性role='person'

    3.加載類初始函數__init__,注意,它不執行代碼

    4.加載類方法attack,注意,它不執行代碼

    5.實例化對象alex

    6.執行類方法attack

    7.打印對象alex的屬性

     

    執行1~4之后,會有一個類命名空間Person,它存儲了3個變量

    執行第5步時,開辟一個實例命名空間alex,它存儲了4個變量,里面還有一個隱藏的變量,類對象指針。

    它指向了類命名空間Person以及自己的實例命名空間

    在初始化方法里面的self,代碼實例本身,也就是實例命名空間alex

    執行第6步。先找自己的內存空間,再找到類對象指針,再根據類對指針找到類 再通過類找到attack

    第7步,打印實例命名空間的屬性。

     

    對象的內存空間里 是不是只包含init方法里面創建的所有屬性?

    加一個age屬性試試

    alex = Person('a_sb', '不詳', 1, 5)
    alex.attack()
    alex.age = 18 #此時init沒有age
    #Person實例化alex
    print(alex.__dict__)
    

    執行輸出:

    a_sb發起了一次攻擊
    {'ad': 5, 'age': 18, 'name': 'a_sb', 'sex': '不詳', 'hp': 1}


    輸出結果里面有age變量了
    這就說明,可以從外面向里面添加屬性

     

    類方法,也可以給self加參數

    class Person:
        role = 'person'  # 靜態屬性
        def __init__(self, name, sex, hp, ad):
            self.name = name  # 對象屬性 屬性
            self.sex = sex
            self.hp = hp
            self.ad = ad
    
        def attack(self):
            self.hobby = 'girl' #增加屬性
            print('%s發起了一次攻擊' % self.name)
    
    
    alex = Person('a_sb', '不詳', 1, 5)
    alex.attack()
    alex.age = 18 #此時init沒有age
    #Person實例化alex
    print(alex.__dict__)
    

    執行輸出:

    a_sb發起了一次攻擊
    {'sex': '不詳', 'name': 'a_sb', 'hp': 1, 'hobby': 'girl', 'age': 18, 'ad': 5}

     

    對象內存空間里: 只存儲對象的屬性,而不存儲方法和靜態屬性
    查詢對象內存空間,使用__dict__

    為什么不存儲類方法呢?假如類有50方法,都存一份?太浪費空間了。
    為了節省空間,所以不存儲類方法

    方法和靜態屬性都存儲在類的內存空間中
    為了節省內存,讓多個對象去恭喜類中的資源
    當類空間不夠時,會自動擴容

    靜態屬性和方法是共享的
    對象屬性是獨有的

    對象不能有自己特有的方法

    人狗大戰里面再升級一下
    人物類型里面有:
    輸出類:攻擊高,血低
    坦克類:血低,攻擊低
    治療類:攻擊低,治療高

    那么每一個類,都是一個單獨的類。

    假如治療類里面有醫生和護士
    醫生, 只能做手術
    護士,只能包扎

    所以醫生和護士,必須是不同的類才行。不能用同一個類,因為方法不通。

    對象和對象之間,方法不同時,那么它們一定是不同的類

     

    在init里面增加和方法名同名的屬性

    class Person:
        role = 'person'  # 靜態屬性
        def __init__(self, name, sex, hp, ad):
            self.name = name  # 對象屬性 屬性
            self.sex = sex
            self.hp = hp
            self.ad = ad
            self.attack = 'haha' #增加和方法名同名的屬性
    
        def attack(self):
            print('%s發起了一次攻擊' % self.name)
    
    
    alex = Person('a_sb', '不詳', 1, 5)
    alex.attack()
    print(alex.__dict__)
    

    執行報錯:

    TypeError: 'str' object is not callable

    為什么呢?因為alex實例命名空間里面找不到attack,所以它從類命名空間中找,但是此時attack變成字符串了,它是被不能執行的

    對象查找順序:先找自己內存空間,再找類的內存空間中的

     

    2個對象,alex和boss_jin。當alex修改類靜態屬性時,boss_jin調用時,也會更改嗎?

    class Person:
        role = 'person'  # 靜態屬性
        def __init__(self, name, sex, hp, ad):
            self.name = name  # 對象屬性 屬性
            self.sex = sex
            self.hp = hp
            self.ad = ad
    
        def attack(self):
            print('%s發起了一次攻擊' % self.name)
    
    
    alex = Person('a_sb', '不詳', 1, 5)
    boss_jin = Person('金老板', '女', 50, 20)
    alex.role = 'dog' #修改類靜態屬性
    print(alex.role) #查看類靜態屬性
    print(boss_jin.role)
    

    執行輸出:

    dog
    person

     

    what?為什么沒有改變,不是說類命名空間,是共享的嗎?

    但凡是對象操作類屬性,它是沒有權利的,它只能存儲在自己內存空間里面

     

    比如模擬人生的游戲

    里面有一家人,爸爸媽媽出去工作賺錢,女兒和兒子上學,要花錢。

    賺的錢,是共享的,大家都可以使用。

    class Person:
        money = 0
        def __init__(self,name):
            self.name = name
    
        def work(self):
            self.money += 1000
            print(self.name,'工作,賺了%s快錢' %self.money)
    
    father = Person('father')
    mother = Person('mother')
    father.work()
    mother.work()
    print(Person.money) #查看錢
    

    執行輸出:

    father 工作,賺了1000快錢
    mother 工作,賺了1000快錢
    0

     

    但是錢沒有漲?為什么?

    因為對象獲取了類屬性money,直接使用self.money += 1000 ,就相當于在本實例空間操作了。

    但是類命名空間并沒有改變,,它還是0

     

     怎么解決這個問題呢?

    直接用類屬性修改

    class Person:
        money = 0
        def __init__(self,name):
            self.name = name
    
        def work(self):
            Person.money += 1000 #類屬性修改
            print(self.name,'工作,賺了%s快錢' %self.money)
    
    father = Person('father')
    mother = Person('mother')
    father.work()
    mother.work()
    print(Person.money) #查看錢
    

    執行輸出: 

    father 工作,賺了1000快錢
    mother 工作,賺了2000快錢
    2000

     

    對于靜態屬性的修改,應該使用類名直接修改,就不會出現不一致的情況
    因為類屬性是共享的。

     

    小作業:
    寫一個類,完成一個功能,可以統計這個類有幾個對象

    代碼如下:

    class Foo:
        count = 0
        def __init__(self):
            Foo.count += 1
    
    f1 = Foo()
    f2 = Foo()
    f3 = Foo()
    print(Foo.count)
    

    執行輸出: 3

     

    如果對象名字一樣呢?結果也是一樣的

    f1 = Foo()
    f1 = Foo()
    f1 = Foo()
    print(Foo.count)
    

    執行輸出: 3

     

    此時此刻,只有一個f1,之前的被覆蓋了。
    實例化一次,就會有一個對象。

     

    小測試,看如下代碼,最終money會輸出多少?2000還是0?

    class Person:
        money = [0]
        def __init__(self,name):
            self.name = name
    
        def work(self):
            self.money[0] += 1000
            print(self.name,'工作,賺了1000快錢')
    
    father = Person('father')
    mother = Person('mother')
    father.work()
    mother.work()
    print(Person.money) #查看錢
    

    執行輸出:

    father 工作,賺了1000快錢
    mother 工作,賺了1000快錢
    [2000]

     

    為什么是2000 ?不是說但凡是對象操作類屬性,它是沒有權利的,它只能存儲在自己內存空間里面

    what?

    第一次類初始化是,money[0] =0。

    當father實例化之后,money[0]的指針就失效了,變成了1000

    當mother實例化之后,money[0]的指針就失效了,變成了2000

    最終結果為2000

     

    因為list是可變類型,它有自己獨立的內存空間。當實例改變時,它就改變了。所以最后調用時,money的值為2000

     

    再來一個小測試,還是上面的例子,修改了一下代碼

    那么money是0還是2000?

    class Person:
        money = [0]
        def __init__(self,name):
            self.name = name
    
        def work(self):
            self.money = [Person.money[0] + 1000]
            print(self.name,'工作,賺了1000快錢')
    
    father = Person('father')
    mother = Person('mother')
    father.work()
    mother.work()
    print(Person.money) #查看錢
    

    執行輸出:

    father 工作,賺了1000快錢
    mother 工作,賺了1000快錢
    [0]

     

    what?怎么是0了?它不是列表嗎?它不是改了嗎?

    城市套路深我想回農村...

     

    請注意表達式self.money = [Person.money[0] + 1000]

    等式先計算右邊的,Person.money[0]之間用類名.屬性名調用,那么應該是[0 + 1000],最終結果為[1000]。

    將結果賦值給self.money,它是實例本身調用money,所以修改的值[1000],存放在本實例空間。

    類屬性,并沒有被改變,所以最終調用類屬性時,輸出結果為[0]

     

    有一個終極方法,一招制敵
    不管時類里面還是類外面,統一使用如下方法修改

    類名.靜態變量名

     

    總結:

     

    實例查找變量的順序:
           先找自己的內存空間->再找到類對象指針->再根據類對象指針找到類->再通過類找

     

    對象的內存空間里: 只存儲對象的屬性,而不存儲方法和靜態屬性
    方法和靜態屬性都存儲在類的內存空間中
    為了節省內存,讓多個對象去共享類中的資源

     

    對象屬性是獨有的,靜態屬性和方法是共享的
    對象使用名字:先找自己內存空間中的,再找類的內存空間中的
    類名.靜態變量名 :對于靜態屬性的修改,應該使用類名直接修改

     

    三、面向對象的實例


    計算圓的周長 2rπ  (r表示半徑)
    計算圓的面積 r²π
    現在有5個圓,半徑分別是1,3,5,7,9

    請使用面向對象編寫出來

    提示:π需要用python模塊math里面的pi方法

    math---數學函數
    作用:提供函數完成特殊的數學運算。

    pi表示圓周率

    from math import pi
    print(pi)
    

    執行輸出:

    3.141592653589793

     

    代碼如下:

    from math import pi
    
    
    class Circle:
        def __init__(self, r):
            self.r = r
    
        def cal_area(self):
            '''
            計算圓面積的方法
            :return:返回值是float數據類型的面積
            '''
            return pi * self.r ** 2
    
        def cal_perimeter(self):
            '''
            計算圓周長的方法
            :return:返回值是float數據類型的周長
            '''
            return pi * self.r * 2
    
    
    for i in range(1, 10, 2): #隔一個取一個,得到1,3,5,7,9
        c1 = Circle(i) #實例化
        print(c1.cal_area())
        print(c1.cal_perimeter())
    

    執行輸出:

    3.141592653589793
    6.283185307179586
    28.274333882308138
    18.84955592153876
    78.53981633974483
    31.41592653589793
    153.93804002589985
    43.982297150257104
    254.46900494077323
    56.548667764616276

     

    到這里
    面向對象的基礎就結束了

     

    作業:

    1.計算圓環的面積和周長
    
    2.默寫交互
    
    3.整理校園管里系統的思路
    
       把需求中找到所有能找到的類,屬性定義出來
    
       比如,學生類,它的屬性有姓名,性別,班級,課程
    
      方法,查看自己所在的班級,查看所學課程
    

     

    答案:

    1.圓環面積和周長公式

    大圓半徑R,小圓半徑r:
    圓環的周長=大圓的周長+小圓的周長
    =2Rπ+2rπ
    =2π(R+r);
    [圓環的面積=大圓的面積-小圓的面積
    =R²π-r²π
    =(R²-r²)π,

     

    代碼如下:

    from math import pi
    
    
    class Ring:
        def __init__(self, R, r):
            self.r = r
            self.R = R
    
        def cal_area(self):
            '''
            計算圓環面積的方法
            :return:返回值是float數據類型的面積
            '''
            return 2 * pi * (self.R + self.r)
    
        def cal_perimeter(self):
            '''
            計算圓環周長的方法
            :return:返回值是float數據類型的周長
            '''
            return (self.R ** 2 - self.r ** 2) * pi
    
    
    c1 = Ring(10, 6)  # 實例化
    print(c1.cal_area()) #面積
    print(c1.cal_perimeter()) #周長
    

    執行輸出:

    100.53096491487338
    201.06192982974676

     

    2.默認交互

    class Person:
        role = 'person'  # 靜態屬性
    
        def __init__(self, name, sex, hp, ad):
            self.name = name  # 對象屬性 屬性
            self.sex = sex
            self.hp = hp  # 血量
            self.ad = ad  # 攻擊力
    
        def attack(self, d):
            d.hp -= self.ad
            print('%s攻擊了%s,%s掉了%s點血' % (self.name, d.name, d.name, self.ad))
    
    
    class Dog:
        role = 'person'  # 靜態屬性
    
        def __init__(self, name, kind, hp, ad):
            self.name = name  # 對象屬性 屬性
            self.kind = kind
            self.hp = hp
            self.ad = ad
    
        def bite(self, p):
            p.hp -= self.ad  # 人掉血
            print('%s咬了%s一口,%s掉了%s點血' % (self.name, p.name, p.name, self.ad))
    
    
    alex = Person('a_sb', '不詳', 1, 5)
    boss_jin = Person('金老板', '女', 20, 50)
    teddy = Dog('笨笨', 'teddy', 50, 10)
    
    teddy.bite(alex)
    print(alex.hp)
    
    boss_jin.attack(teddy)
    print(teddy.hp)
    

    3.題目需求鏈接

    https://www.cnblogs.com/Eva-J/articles/7747946.html

     

    posted @ 2018-04-11 15:07 肖祥 閱讀(...) 評論(...) 編輯 收藏
    版權聲明:本文為shykevin原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。
    本文鏈接:https://blog.csdn.net/shykevin/article/details/90102269

    智能推薦

    【Python面試】 說說Python變量、函數、類的命名規則?

    往期面試題: 談談對 Python 和其他語言的區別? 說說4種常用編碼的區別? 說說Python面向對象三大特性? 說說Python中有幾種數據類型? 廢話不多說,開始今天的題目: 問:Python變量、函數、類的命名規則? 答:Python命名規范在編寫代碼中起到很重要的作用,雖然不遵循命名規范,程序可能也可以運行,但是使用命名規范可以更加直觀地了解代碼所代表的含義。 Python的命名規范(...

    【Python面試】 說說Python變量、函數、類的命名規則?

    最近公眾號新增加了一個欄目,就是每天給大家解答一道Python常見的面試題,反正每天不貪多,一天一題,正好合適,只希望這個面試欄目,給那些正在準備面試的同學,提供一點點幫助! 小猿會從最基礎的面試題開始,每天一題。如果參考答案不夠好,或者有錯誤的話,麻煩大家可以在留言區給出自己的意見和討論,大家是要一起學習的 。 廢話不多說,開始今天的題目: 問:Python變量、函數、類的命名規則? 答:Pyt...

    hive 導出數據之一列多行,轉為一行多列

    需求:提取數據 說明:原數據是一列多行,需要轉化為一行多列 待查詢表為:temp_05 待查詢數據為: 待查詢數據如圖: 需要提取的數據表頭如下: 預定日期 昨日價格 前天價格 2018-02-01 2018-02-02 2018-02-03 2018-02-04 可用提數 SQL 數據如圖: 以下為嘗試過程 數據如圖: 數據如圖: 數據如圖: 數據如圖:...

    asp.net做一個簡易的聊天室

    要求: 結果: 關鍵代碼: Default.aspx Default.aspx.cs Default2.aspx Default2.aspx.cs Default3.aspx Default3.aspx.cs Default4.aspx...

    動態SQL和多表關聯-筆記

    《動態SQL與多表關聯》筆記 學習目標 能夠使用動態SQL完成SQL拼接 能夠使用resultMap完成多表查詢 能夠使用一對一查詢 能夠使用一對多查詢 (注:多對多其實就是兩個一個多) 映射文件:為什么要resultMap 目標 定義結果映射 使用結果映射 回顧 在mybatis中有2種配置文件: 核心配置文件,如:sqlMapConfig.xml 實體類映射文件,如:UserMapper.xm...

    猜你喜歡

    【OpenGL C++ UE4】獲取模型頂點及面索引數據,并優化存儲結構供UE4繪制

    目錄 一、功能需求 二、成果 三、環境配置 四、詳細步驟 4.1 Max制作三棱錐并處理 4.2 核心代碼 4.2.1 傳入結構體數據 4.2.2 頂點去重、更新索引 4.2.3 輸出本地CSV文件 4.3 UE4繪制 一、功能需求 想必你肯定會問我一個問題,UE4直接導入模型不好么? 哈哈,前提是在做畢設時,導師提供的只有頂點與面索引數據,沒有模型。 下文詳細介紹了畢設開發中的難點,涉...

    解決Pyinstaller打包numpy和pandas庫文件過大問題

    解決Pyinstaller壓縮numpy和pandas庫文件過大問題 文件包類型和網上的方法 Windows下docker的安裝 在docker下實現打包     今天是2021年的第一天,先祝各位小伙伴現年快樂哈。最近因為做了一個項目,需要打包文件,文件中包含了numpy和pandas庫,結果打包出來幾百行的代碼居然要900m,人都傻了,翻遍了全網找解決方...

    【混沌工程】基于ChaosBlade實現網絡故障模擬

    一、前言 很久之前曾基于linux內核自帶的TC和netem模擬一些公網中遇到的極端情況(延遲、丟包、重復、損壞和亂序等),驗證了我們傳輸程序的健壯性! 具體細節可見這篇老博客: https://blog.csdn.net/u013128262/article/details/84784663 最近在復現kafka生產端一個timeout異常場景時,發現之前方案時因為內核和OS版本問題有些差異而無...

    使用FileZilla連接時超時,無法連接到服務器

    用FileZilla連接服務器時,顯示錯誤: 解決方法: 檢查基本的內容 主機是否寫錯 端口是否自定義,默認21 檢查用戶名和密碼是否錯誤 如果連接的是公司內網 使用ping命令,測試一下是否能收到數據 收不到則需要開啟VPN,再ping,看是否能接收數據(請老鐵們用自己最合適的方法解決) 如果開啟VPN后能接收數據,則可以連接一下服務器,如果不行(怎么可能不行),則跳轉3并依次嘗試 開啟VPN后...

    精品国产乱码久久久久久蜜桃不卡