Python - 面向對象(一)入門篇


什么是對象和類

https://www.cnblogs.com/poloyy/p/15178423.html

 

Python 類

類定義語法

最簡單的類定義看起來像這樣

class ClassName:
    <statement-1>
    .
    .
    .
    <statement-N>

類定義與函數定義 (def 語句) 一樣必須被調用執行才會起作用

 

類命名空間

  • 當定義類時,會創建一個新的命名空間,也是一個局部作用域
  • 上面的類定義栗子里,statement-1 到 statement-N 就是這個類的命名空間

 

類的取名建議規則

類名中的所有單詞首字母要大寫,采用駝峰命名法(例 GameCase )的書寫方式

 

最簡單的一個類

class Dog:
    pass
  • 這個類沒有屬性也沒有方法
  • 實際應用中,很少會創建空類,因為空類沒有任何實際意義

 

包含屬性、方法的一個類

class Person:
    def introduce(self):
        print('My name is %s, I am %d years old' % (self.name, self.age)) 

Person 類,有一個方法 introduce,有兩個屬性 name、age

 

通過 Person 類創建兩個實例對象

# 對象一
tom = Person()

# 對象屬性
tom.name = 'tom'
tom.age = 10

# 對象二
jerry = Person()
     
# 對象屬性   
jerry.name = 'jerry'
jerry.age = 20

# 調用對象的方法
tom.introduce()
jerry.introduce()


# 輸出結果
My name is tom, I am 10 years old
My name is jerry, I am 20 years old

 

類對象

什么是類對象

  • 聲明了一個類,它就是一個類對象
  • 程序運行時,在內存中就會創建一個類對象,有且只有一個
  • 類對象也有自己的屬性和方法,分別叫做:類屬性、類方法(后面詳解)

 

打印下類對象看看

# 類對象
class person:
    pass


print(person)
print(id(person))


# 輸出結果
<class '__main__.person'>
140485598521200

 

打印的就是一個類對象和內存地址

 

類對象支持兩種操作

  1. 屬性引用
  2. 實例化

 

屬性引用

  • 使用 Python 所有屬性引用的標准語法: Obj.name 
  • 有效的屬性名稱是類對象被創建時存在於類命名空間中的所有名稱
class MyClass:
    """A simple example class"""
    i = 12345

    def f(self):
        return 'hello world'

 

有效的屬性引用

  • MyClass.i:返回一個整數
  • MyClass.f:返回一個函數對象
  • MyClass.__doc__:返回當前類的文檔字符串
print(MyClass.i)
print(MyClass.f)
print(MyClass.__doc__)


# 輸出結果
12345
<function MyClass.f at 0x10f43f310>
A simple example class

  

實例化

實例化其實就是調用類對象,從而創建一個實例對象

c = MyClass()

創建類的新實例並將此對象分配給局部變量 c

 

實例對象

什么是實例對象

  • 通過類實例化操作的對象就是實例對象
  • 一個類可以多次實例化,生成多個實例對象
# 實例對象
class person:
    pass


# 實例化:類名()
p1 = person()
p2 = person()
p3 = person()
print(p1, id(p1))
print(p2, id(p2))
print(p3, id(p3))


# 輸出結果
<__main__.person object at 0x10e42b8b0> 4534220976
<__main__.person object at 0x10e42b880> 4534220928
<__main__.person object at 0x10e42b850> 4534220880

 

三個 person 類實例對象,分別有自己獨立的內存地址 

 

 

常說的面向對象編程是什么

  1. 設計類
  2. 創建類實例對象
  3. 實例對象調用方法

 

創建實例對象詳解

  1. 內存中為對象分配空間
  2. 調用初始化方法  __init__  為對象初始化
  3. 對象創建后,內存中就有一個類的實例對象了

由此可見,一個類可以有很多個對象,每個對象都有屬於自己的變量、方法;

  • 創建出來的 對象 叫做 類的 實例對象
  • 創建對象的 行為 叫做 實例化
  • 對象的屬性 叫做 實例屬性
  • 對象調用的方法 叫做 實例方法

__init__、實例屬性、實例方法后續詳解

 

知識點

  • 每個對象都有自己獨立的內存空間,保存自己的屬性
  • 但是實例方法在內存中都只有一個,實例方法中的 self 就是實例對象的引用,當對象調用實例方法時,會默認把實例對象傳給方法內部

如果不懂的話,看看下面代碼的輸出就知道啦; id() 是用於獲取對象的內存地址

class person():
    def __init__(self, name):
        self.name = name
        print(f"init-{self.name} ", id(self))

    def test(self):
        print(f"test-{self.name} ", id(self))


p1 = person("p1")
print("p1-", id(p1))
print("p1 fun-", id(p1.test()))

print("")

p2 = person("p2")
print("p2-", id(p2))
print("p2 fun-", id(p2.test()))

print("調用方法對比:",id(p1.test()) == id(p2.test()))

執行結果

init-p1  1921848172840
p1- 1921848172840
test-p1  1921848172840
p1 fun- 140719454498016

init-p2  1921848175136
p2- 1921848175136
test-p2  1921848175136
p2 fun- 140719454498016
test-p1  1921848172840
test-p2  1921848175136
調用方法對比: True

 

實例變量和類變量

實例屬性=實例變量

類屬性=類變量

class Person():
    name = "cool guy"


if __name__ == "__main__":
    p = Person()
    print(p.name)  # 打印name屬性,因為實例並沒有name屬性,所以會繼續查找class的name屬性
    print(Person.name)  # 打印類的name屬性

    p.name = "bad guy"  # 給實例綁定name屬性
    p.age = 12  # 給實例綁定age屬性

    print(p.age)  # 實例找到age直接打印
    print(p.name)  # 由於實例屬性優先級比類屬性高,因此,它會屏蔽掉類的name屬性
    print(Person.name)  # 仍然打印類的name屬性

執行結果

cool guy 
cool guy
12 bad guy cool guy

注意點

  • 在寫代碼時,要避免類屬性和實例屬性重名,否則實例變量會屏蔽掉類屬性
  • 給實例綁定新的實例屬性時,會直接覆蓋掉重名的類屬性

 

類方法會在下一篇幅介紹哦!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM