1. 程式人生 > >初識面向物件一

初識面向物件一

python中一切皆物件
# 類 : 具有相同屬性和方法的一類事務
# 描述一類事務輪廓的一個機制
# 商品/使用者/店鋪
# 物件/例項 :物件(例項)就是類的例項化
# 物件就是類的一個具體的表現
# 某一件特定的商品/某個人/某一家店
# 例項化 : 類 --> 物件
# 例項化的過程:
# 1.建立一個屬於物件的空間
# 2.執行__init__,把這個空間傳遞給init的第一個引數
# 3.把這個空間地址作為返回值返回給物件變數
# 如何定義一個類
# class Cls:pass
# 在類中直接可以定義的內容:
# 靜態屬性 : 這個類擁有的,所有的物件都共享的屬性
# 動態屬性 : 方法\定義在類中的函式,描述的是所有物件共享的行為
# 類名的作用:
# 例項化的時候 物件 = 類名()
# 操作靜態屬性
# 物件名的作用:
# 操作物件的屬性
# 呼叫方法
類中程式碼的執行順序
# 一個類可不可以沒有__init__? 可以
# 在沒有__init__的情況下,例項化經歷了哪些步驟???
# 1.建立一個空間給物件
# 2.將這個空間的地址返回

# class A:
# Country = 'China'
# def __init__(self,name):
# self.name = name
# def talk(self):
# print('%s is talking'%self.name)
# 類中的程式碼是在什麼時候執行的? 在例項化之前
# 類的名稱空間中有什麼:
# 靜態屬性
# 動態屬性(方法)

# 物件的名稱空間和類的名稱空間之間的關係 :
# 物件和類之間有一個單向的聯絡,類物件指標
# 物件在使用某個名字的時候,如果在自己的空間中沒有找到,就要到類的空間中去找
# class A:
# Country = 'China'
# def __init__(self,name):
# self.name = name
# def talk(self):
# print('%s is talking'%self.name)
#
# asd= A('asd') 在例項化的過程中,又開闢了屬於物件的一塊空間

# 物件可以檢視類的靜態屬性,但是不能修改
# 並且一旦修改,就不能取到類當中的內容了(除非手動刪除這個修改的屬性)

# 所有的靜態屬性的修改,都應該由類名來完成,而不應該使用物件名來完成

# 寫一個類,能夠記錄這個類有多少個物件了(每一次例項化都能夠被記錄下來)
# class A:
# count = 0
# def __init__(self):
# A.count += 1
# print(A.count)
# a = A()
# print(A.count)
#
# class A:
# count = 0
# def __init__(self):
# self.counter()
# def counter(self):
# A.count+=1
# a = A()
# 如果靜態變數是一個不可變資料型別,那麼只要物件修改這個資料,就相當於在物件的空間中新建
# 如果靜態變數是一個可變資料型別,那麼物件修改這個容器中的元素,相當於修改類的空間中的元素
# 如果靜態變數是一個可變資料型別,那麼物件直接對這個變數重新賦值,相當於修改物件自己空間中的元素

# 大結論
# 只要是靜態變數,就用類名去修改,永遠修改成功,並且所有的物件都共享這個改變


# 總結
# 物件的名稱空間:類指標\物件的所有屬性
# 類的名稱空間:方法和(靜態屬性\欄位)
# 物件在尋找名字的時候 : 先找物件自己記憶體空間中的,找不到就去類的名稱空間中尋找
# 類中的名字是什麼時候寫入記憶體的 : 程式碼從上到下執行的時候就已經寫入的.一定是在例項化之前
# 靜態變數 : 儘量用類名去操作

組合
計算圓跟環形的周長面積
from math import pi
class Circle:
def __init__(self,r):
self.r = r

def area(self):
return pi*self.r**2

def perimeter(self):
return 2*pi*self.r

class Ring:
def __init__(self,outer_r,inner_r):
c1 = Circle(outer_r)
c2 = Circle(inner_r)
self.out_c = c1 # c1.area() self.out_c.area()
self.in_c = c2 # c2.area() self.in_c.area()

def area(self):
return self.out_c.area() - self.in_c.area()

def perimeter(self):
return self.out_c.perimeter() + self.in_c.perimeter()

r1 = Ring(10,5)
print(r1.area())
print(r1.perimeter())