類屬性和實例化屬性


類的構成包括成員屬性和成員方法(數據成員和成員函數)
類的方法,有這么幾個種:類方法、靜態方法和實例方法。
類的屬性也分為兩種:一種是實例化屬性,一種是類屬性。

類的方法

類方法:

@classmethod # 類方法 需要cls參數,代表調用該函數的類.一般是用來訪問類屬性的

靜態方法

@staticmethod # 靜態方法:靜態方法只在內存中生成一個,節省開銷(也叫類的工具包)。

實例方法

def f3(self): # 實例方法需要self參數,代表調用該函數的實例

類屬性

類屬性對於所有的實例是公用的,與實例無關,一般定義在類中方法以外,當然類屬性也可以定義在方法內的,
類屬性是定義在類層面的,因此類屬性要比實例屬性作用域范圍要廣一些。

實例屬性是與實例綁定的,只與實例有關,在類層次上是看不到的,

定義在類實例方法內。實例屬性使用實例對象定義,而且對於每個實例化對象都是獨立存在的。

在方法中定義的屬性與方法外定義的屬性略有不同。在方法外定義的類屬性(count、lst),
只要類定義完成就已經生成;而在方法內定義的類屬性,需要調用方法之后才會生成。也就是要實例化


使用類名稱修改類屬性

使用類名稱修改類屬性之后,不管用類名稱還是實例名稱調用類屬性,
都是一樣的,說明修改的的確是類屬性。

使用類的實例化對象修改類屬性

可變類型可修改,不可變類型不可修改

"""
類的構成包括成員屬性和成員方法(數據成員和成員函數)
類的方法,有這么幾個種:類方法、靜態方法和實例方法。
類的屬性也分為兩種:一種是實例化屬性,一種是類屬性。
"""
 # 定義一個類
class MyClass:
    i = "MyClass類屬性 i"
    def __init__(self):
        self.i='實例化屬性 i'
    @classmethod # 類方法 需要cls參數,代表調用該函數的類.一般是用來訪問類屬性的
    def f1(cls):
        return cls.i
    @staticmethod # 靜態方法:靜態方法只在內存中生成一個,節省開銷(也叫類的工具包)。
    def f2(i): 
        return i
    def f3(self): # 實例方法需要self參數,代表調用該函數的實例
        return self.i
# 定義另一個類
class b:
    i="class b 的類屬性"
    def f1(self):
        return self.i
# 實例化類
x = MyClass() # 實例方法
# 方法調用效果
print("MyClass 類的方法 f1 輸出為:", MyClass.f1())
print("MyClass 類的方法 f1 輸出為:", x.f1())
print("MyClass 類的方法 f2 輸出為:", MyClass.f2(2))
print("MyClass 類的方法 f2 輸出為:", x.f2(5))
print("MyClass 類的方法 f3 輸出為:", x.f3())
print("MyClass 類的方法 f3 輸出為:", MyClass.f3(x))
# 鴨子類型的表現
print("MyClass 類的方法 f3 輸出為:", MyClass.f3(b))
print("   b    類的方法 f1 輸出為:", b.f1(MyClass)) 
print("   b    類的方法 f1 輸出為:", b.f1(x)) 


# 類的屬性
class C:
    """
    變量 x 和 words 是實例屬性
    count、lst、say是類屬性。
    """
    count=0
    lst=[1,2,3]
    def __init__(self, num = 0):
        self.x = num
        C.count += 1
        if C.count>3:
            C.say="好多實例對象啊!"
        else:
            C.say="實例對象好孤單啊!"
    def fprint(self,string):
        self.words=string
        print(self.words) 

# 實例屬性是與實例綁定的,只與實例有關,在類層次上是看不到的,
# 定義在類實例方法內。實例屬性使用實例對象定義,而且對於每個實例化對象都是獨立存在的。
a = C(5)
a.x # 5
a.fprint("a說,我是第一個實例對象")
a.words

# 每個實例化對象的屬性都是獨立的
c = C()
c.x # 0
c.y =2
c.y # 2
# a.y # 'C' object has no attribute 'y'

# 類屬性
"""
類屬性對於所有的實例是公用的,與實例無關,一般定義在類中方法以外
當然類屬性也可以定義在方法內的,
類屬性是定義在類層面的,因此類屬性要比實例屬性作用域范圍要廣一些。
這里, count 和 lst 就是直接定義在類中方法以外的類屬性,類屬性通過類名調用。
"""
# 直接使用類名稱調用類屬性
C.lst # [1,2,3]
C.count # 3
C.say
print("實例調用與類名調用屬性")
d = C(1) # # 實例化之后原來的屬性值改變
d.say 
C.say
"""
   在方法中定義的屬性與方法外定義的屬性略有不同。在方法外定義的類屬性(count、lst),
   只要類定義完成就已經生成;而在方法內定義的類屬性,需要調用方法之后才會生成。也就是要實例化
"""

# 使用類名稱修改類屬性
"""
使用類名稱修改類屬性之后,不管用類名稱還是實例名稱調用類屬性,
都是一樣的,說明修改的的確是類屬性。
"""
C.count = 9
c.lst[1] = 5
C.count
C.lst

# 使用類的實例化對象修改類屬性
# 可變類型可修改,不可變類型不可修改

參考類屬性(方法)和類實例化屬性(方法)


免責聲明!

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



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