类属性、类方法;私有属性、公有属性;私有方法、公有方法;静态属性、静态方法;python的命名规范__xx__\__xx\_xx(自用笔记)
Ⅰ、類屬性、類方法(類和實例都能調用類屬性和類方法)
類是一個特殊的對象,Python 中 一切皆對象:class AAA: #定義的類屬于 類對象obj1 = AAA() #屬于 實例對象 除了封裝 實例 的 屬性 和 方法外,類對象 還可以擁有自己的 屬性 和 方法:·類屬性·類方法(方法前面要加上@classmethod裝飾器。不用實例化就可以執行類的方法) 通過 類名. 的方式可以 訪問類的屬性 或者 調用類的方法(方法的參數中要用cls參數且放到最前) class A:a=1@classmethoddef aa(cls):print("這是類方法") s=A() print(A.a)#調用屬性 1 A.aa() #調用方法 這是類方法 print(s.a) 1 s.aa() 這是類方法class B:def __init__(self):self.a=1def aa(self):print("這是實例方法") m=B() >>>print(B.a) Traceback (most recent call last):File "<stdin>", line 1, in <module> AttributeError: type object 'B' has no attribute 'a' >>>B.aa() Traceback (most recent call last):File "<stdin>", line 1, in <module> TypeError: aa() missing 1 required positional argument: 'self' >>>B.aa(m)#具體原因可以參考之前self的文章,請點入口1 這是實例方法 >>>print(m.a) 1 >>>m.aa() 這是實例方法入口1
Ⅱ、私有屬性與公有屬性
在定義類的屬性時,如果屬性名以兩個下劃線“__”開頭則表示是《私有屬性》,否則是《公有屬性》。 ①私有屬性在類的外部不能直接訪問,需要調用對象的“公有成員方法”來訪問, 或者 ②通過python支持的特殊方式來訪問。 Python提供了訪問私有屬性的特殊方式,可用于程序的測試和調試,對于成員方法也有同樣性質。方法如下:對象名._類名+私有成員 例如:訪問Car類私有成員__weight car1._Car__weight 注意:私有屬性是為了數據封裝和保密而設的屬性,一般只能在類的成員方法(類的內部)中使用訪問,雖然Python支持一種特殊的方式來從外部直接訪問類的私有成員,但是并不推薦這種做法。 #在類的成員方法(類的內部)中使用訪問 class Car:price =1000 #定義類屬性,類和對象訪問def __init__(self,c,w):self.color=c #定義共有屬性color,對象訪問self.__weight=w #定義私有屬性__weight,類和對象都不能訪問def siyou(self):return self.__weight car1 = Car("red",10.5) >>>print(Car.price) 1000 >>>print(Car.color) Traceback (most recent call last):File "<input>", line 1, in <module> AttributeError: type object 'Car' has no attribute 'color'>>>print(car1.price) 1000>>>print(car1.color) red>>>print(car1.__weight) Traceback (most recent call last):File "<stdin>", line 1, in <module> AttributeError: 'Car' object has no attribute '__weight'>>>print(car1.siyou()) 10.5Ⅲ、私有方法、公有方法
私有方法、公有方法都屬于對象,私有方法的名字以兩個下劃線“__”開始,每個對象都有自己的公有方法和私有方法,在這兩類方法中可以訪問屬于類和對象的成員; ①公有方法通過對象名直接調用, ②私有方法不能通過對象名直接調用,只能在屬于對象的方法中通過“self”調用,或者外部通過Python支持的特殊方式來調用 class Test:def __test2(self):print("這是私有方法")def test(self):print("這是公有方法1")def _test(self):print("這是公有方法2")self.__test2() t=Test() >>>t.test() 這是公有方法1 >>>Test.test() Traceback (most recent call last):File "<input>", line 1, in <module> TypeError: test() missing 1 required positional argument: 'self' >>>t._test() 這是公有方法2 這是私有方法 >>>t.__test 'Test' object has no attribute '__test'Ⅳ、靜態屬性、類方法(上面提到過)、靜態方法
一、靜態屬性
靜態屬性說的就是數據屬性,把方法變成像屬性一樣調用
1、定義一個房間的類,求下這個房間的面積
class Room:def __init__(self,name,ower,width,length,heigh):self.Name=nameself.Ower=owerself.Width=widthself.Length=lengthself.Heigh=heighdef cal_area(self):print("%s 住的%s 總面積是%s平米的地下室" %(self.Ower, self.Name, self.Width * self.Length)) r1=Room("廁所","北爺",2,2,20000)#實例化出來一個實例r1,實例化的過程就是執行__init__ r2=Room("北京","喵爺",20,60,20000)#實例化第二個實例 r1.cal_area()#實例調用類的函數屬性會自動傳實例本身作為參數 r2.cal_area()#實例調用類的函數屬性會自動傳實例本身作為參數輸出結果:北爺 住的廁所 總面積是4平米的地下室喵爺 住的北京 總面積是1200平米的地下室1、1 property裝飾器
class Room:def __init__(self,name,ower,width,length,heigh):self.Name=nameself.Ower=owerself.Width=widthself.Length=lengthself.Heigh=heigh@property #把一個方法變成一個數據屬性def cal_area(self):print("%s 住的%s 總面積是%s平米的地下室" %(self.Ower, self.Name, self.Width * self.Length)) r1=Room("廁所","北爺",2,2,20000)#實例化出來一個實例r1,實例化的過程就是執行__init__ r2=Room("北京","喵爺",20,60,20000) r1.cal_area#用了property這個裝飾器之后,實例在調用函數屬性就等于調用數據屬性,不用加()就可以調用 r2.cal_area輸出結果:北爺 住的廁所 總面積是4平米的地下室喵爺 住的北京 總面積是1200平米的地下室1.2 這樣還不行。因為正常的數據屬性直接運行是沒有返回值的
現在改為了直接return一個返回值,現在用起來的效果就是跟調用數據屬性是一模一樣的了,property這個裝飾器就是把類的函數屬性變為數據屬性,也就是封裝成了數據屬性
二、python給我們提供了classmethod這個裝飾器,只要用了這個方法, 就表示這個裝飾器下面的方法是專門給類用的
這個方法就是只是類在調用類的方法,跟實例沒關系,只要加了classmethod就只能供類調用
class Room:tag=1#定義一個類的數據屬性def __init__(self,name,ower,width,length,heigh):self.Name=nameself.Ower=owerself.Width=widthself.Length=lengthself.Heigh=heigh@classmethod#這個裝飾器是專門供類使用的方法def tell_info(cls):#cls代表類本身print(cls)print("---",cls.tag)#等價于Room.tag Room.tell_info()#會自動把類本身傳給cls#輸出結果<class '__main__.Room'>--- 1三、靜態方法 叫類的工具包,不跟類綁定也不跟實例綁定。也就是說都能用
class Room:tag=1#定義一個類的數據屬性def __init__(self,name,ower,width,length,heigh):self.Name=nameself.Ower=owerself.Width=widthself.Length=lengthself.Heigh=heigh@classmethod#這個裝飾器是專門供類使用的方法def tell_info(cls):#cls代表類本身print(cls)print("---",cls.tag)@staticmethod#靜態方法 叫類的工具包,不跟類綁定也不跟實例綁定def wash_body(a,b,c):print("%s %s %s 正在洗澡" %(a,b,c)) Room.wash_body("北爺","喵爺","修電腦")#用類調用washbody這個方法 r1=Room("廁所","北爺",2,2,20000)#實例化一個實例r1 r1.wash_body("北爺","喵爺","修電腦")#用實例調用washbody這個方法#輸出結果: 北爺 喵爺 修電腦 正在洗澡北爺 喵爺 修電腦 正在洗澡總結:
靜態屬性:property類和實例都可以訪問靜態屬性(把函數封裝成一個數據屬性,讓外面的人感受不 到是調用的函數屬性)
類方法: classmethod類訪問類方法,實例也能訪問類方法
靜態方法:staticmethod 用類可以調用靜態方法,實例也可以調用靜態方法不跟類和實例綁定,只叫類的工具包
Ⅴ、python的命名規范
python中有幾種比較有意思的命名的方式,__xxx__、__name 、_name、,下面分別說它們的用處。
【__xxx__】在Python中,所有以“__”雙下劃線包起來的方法,都統稱為“Magic Method”(魔術方法),是可以直接訪問的。例如類的初始化方法 __init__ ,Python中所有的魔術方法均在官方文檔中有相應描述
def __init__(self, name)魔術方法大全,大家可以點這里參考一下
【__name】雙下劃線開頭,表示的是私有變量,為了讓內部屬性不被外部訪問。
【_name】_xxx被看作是“私有的”,在模塊外不可以使用,在類外可以用。當變量是私有的時候,用_xxx 來表示變量是很好的習慣。單下劃線 開始的成員變量叫做保護變量,意思是只有本模塊、類、對象和子類對象自己能訪問到這些變量,被導入時,該變量不能引用;
總結
以上是生活随笔為你收集整理的类属性、类方法;私有属性、公有属性;私有方法、公有方法;静态属性、静态方法;python的命名规范__xx__\__xx\_xx(自用笔记)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: pyton中的self具体含义,加sel
- 下一篇: python的tkinter窗口位置\坐