基於python中的類屬性類結構及私有屬性私有方法
類
舊式類(經典類)和新式類
Python中類分兩種:舊式類和新式類:
新式類都從object繼承,經典類不需要。
新式類是自動呼叫object類的
python3.幾版本後可以自動呼叫基類(object類)
類的抽象化:類定義之後不呼叫是沒辦法輸出的。
在Python 3.x中取消了經典類,預設都是新式類,並且不必顯式的繼承object,也就是說:
class Person(object):pass
class Person():pass
class Person:pass
三種寫法並無區別,推薦第一種
但是在Python2.x中,預設都是經典類,只有顯式繼承了object才是新式類,即:
class Person(object):pass 新式類寫法
class Person():pass 經典類寫法
class Person:pass 經典類寫法
什麼是類?
類是一個特殊的物件
Python中一切皆物件
class AAA: 定義的類屬於類物件
obj1 = AAA:屬於例項物件
在執行程式時, 類同時會被載入到記憶體
類的結構
例項:
1.使用面向物件開發,第一步是設計類
2.使用類名()建立物件,建立物件的動作有兩步
1.在記憶體中為物件分配空間
2.呼叫初始化方法init為物件初始化
3.物件建立後,記憶體中就有了一個物件的實實在在的存在–例項
因此:
1.創建出來的物件叫做類的例項
2.建立物件的動作叫做例項化
3.物件的屬性鍵作例項屬性
4.物件呼叫的方法叫做例項方法
為什麼類是抽象的?
抽象類提供多個派生類共享基類的公共定義,它既可以提供抽象方法,也可以提供非抽象方法。抽象類不能例項化,必須通過繼承由派生類實現其抽象方法。
抽象類既可以定義規則,還可能提供已實現的成員。
抽象類可以定義欄位、屬性、包含有實現的方法。
抽象類只能作用於引用型別。
在程式執行時:
1.物件各自擁有自己的例項屬性
2.呼叫物件的方法,可以通過self
訪問自己的屬性
呼叫自己的方法
結論:
1.每一個物件都有自己獨立的記憶體空間,儲存各自不同的屬性
2.多個物件的方法,在記憶體中有一份,在呼叫方法時,需要把物件的引用傳遞到方法內部
class Tool (object):
def __init__(self, name):
self.name = name
tool1 = Tool('耳機')
tool2 = Tool('充電線')
tool3 = Tool('手機')
class Tool(object):
# 1.使用了賦值語句定義類屬性,記錄所有工具的數量
count = 0
def __init__(self, name):
self.name = name
# 讓類屬性+1
Tool.count += 1
# 建立工具物件(物件在建立的時候,會自動呼叫初始化方法)
tool1 = Tool('耳機')
tool2 = Tool('充電線')
tool3 = Tool('手機')
# 輸出物件的總數
# 使用 類名.屬性名 來獲取
print Tool.count
類屬性
在python中,類是一個特殊的物件–類物件
@classmethod
除了封裝 例項(物件) 的屬性和方法外,類物件還可以有自己的方法和屬性
通過 類名.的方式可以直接訪問類的屬性或者呼叫類的方法
class Toy(object):
# 1.定義類屬性
count = 0
@classmethod
def show_toy_count(cls):
# cls.count:在類方法的內部,訪問當前的類屬性
print '玩具物件的數量 %d' % cls.count
def __init__(self, name):
self.name = name
Toy.count += 1
# 讓類屬性的值 +1
# 建立玩具物件
toy1 = Toy('芭比')
toy2 = Toy('丁丁車')
toy3 = Toy('大毛')
# 呼叫類方法
Toy.show_toy_count()
# 在方法的內部,可以直接訪問類屬性
靜態方法:
在開發時,如果需要在類中封裝一個方法,這個方法:
即不需要訪問例項屬性或者呼叫例項方法
也不需要訪問類屬性或呼叫類方法
這個時候可以把這個方法封裝成一個靜態方法
語法如下:
@staticmethod
def 靜態方法():
pass
靜態方法需要修飾器@staticmethod來標示,告訴直譯器這是一個靜態方法
通過類名,呼叫例項方法
class Cat(object):
@staticmethod
# 靜態方法不需要傳遞第一個引數:self
def call():
print '小貓喵喵叫'
# 通過類名,呼叫靜態方法
# 不需要建立物件,可以直接使用
Cat.call()
綜合應用:
1.設計一個Game類
2.屬性
設計記錄遊戲的歷史最高分
記錄當前遊戲玩家的玩家姓名
3.方法:
方法show_help顯示遊戲幫助
方法show_top_score顯示歷史最高分
方法start_game開始當前玩家的遊戲
4.主程式步驟
1.檢視幫助資訊
2.檢視歷史最高分
3.建立遊戲物件,開始遊戲
class Tools(object):
@staticmethod
def show_help():
print 'help menu ,我可以幫到你哦'
def Pleyer_name(self):
print '當前玩家: %s' % self.name
def start_game(self):
print '歡迎來到第一關,遊戲開始,請做好準備'
class Game(Tools):
def __init__(self, name, score):
self.name = name
self.score = score
self.history = 20
def show_top_score(self):
# 1. 判斷玩家得分
if self.score <= self.history:
print '對不起,您距離最高分還差一點點'
return
else:
print ' 最高分 %s' % self.score
Player = Game('xiaoming', 60)
Tools.show_help()
Player.Pleyer_name()
Player.show_top_score()
Player.start_game()
1.設計一個Game類
2.屬性
類屬性
設計記錄遊戲的歷史最高分
例項方法
記錄當前遊戲玩家的玩家姓名
3.方法:
靜態方法
方法show_help顯示遊戲幫助
方法show_top_score顯示歷史最高分
方法start_game開始當前玩家的遊戲
4.主程式步驟
1.檢視幫助資訊
2.檢視歷史最高分
class Game(object):
# 1.記錄歷史最高分
top_score = 0
def __init__(self, player_name):
self.player_name = player_name
@staticmethod
def show_help():
print 'Help menu'
@classmethod
def show_top_score(cls):
print '歷史記錄 %d' % cls.top_score
def start_game(self):
print '%s 開始遊戲,請做好準備' % self.player_name
player = Game('花花')
player.show_help()
player.start_game()
player.show_top_score()
案例小結
1.例項方法:方法內部需要訪問例項屬性
2.類方法:方法內部只需要訪問類屬性
3.靜態方法:方法內部不需要訪問例項屬性和類屬性
提問:如果方法內部,即需要訪問例項屬性,又需要訪問類屬性,應該使用哪種方法
應該定義例項方法
私有屬性和私有方法:
應用場景:
在實際開發中,物件的某些屬性或方法只希望在物件的內部使用,而不希望在外部被訪問到
私有屬性 就是物件 不希望公開的屬性
私有方法 就是物件 不希望公開的方法
定義方法:
在定義屬性或方法是,在屬性或方法名前增加兩個下劃線,定義的就是私有方法和屬性
父類的私有屬性和私有方法
1.字類物件不能在自己的方法內部,直接訪問父類的私有方法
2.字類物件可以通過父類惡公有方法簡介訪問到私有屬性
私有屬性,私有方法是物件的隱私,不對外公開
私有屬性,私有方法常用做一些內部的事情
class Girl():
def __init__(self,name):
self.name = name
self.__age = 3
print self.__age
def __secret(self):
print '%s的年齡是 %d' % (self.name,self.__age)
# 私有屬性,外界不允許訪問
lily = Girl('Lily')
# 私有方法,外界不允許直接訪問
lily.secret()
在繼承中,子類不能繼承父類的私有屬性/呼叫私有方法
class A(object):
def __init__(self):
# 初始化定義了一個共有屬性和一個私有屬性
self.num1 = 100
self.__num2 = 200
def __test(self):
print '私有方法'
print '%s %s' %(self.num1,self.__num2)
# 父類中定義了一個私有方法
class B(A):
pass
# 建立了一個字類物件
b = B()
print b
# 在繼承中,子類不能繼承父類的私有屬性/呼叫私有方法
# b.__num2
# b.__test
print b.__num2
父類的私有屬性和私有方法
1.子類物件不能在自己的方法內部,直接訪問父類的私有屬性和私有方法
2.子類物件可以通過父類的共有屬性間接訪問到私有屬性或私有方法
私有屬性,私有方法是物件的隱私,不對外公開,外界以及子類都不能直接訪問
私有屬性,私有方法常做一些內部的事情
class A(object):
def __init__(self):
# 初始化定義了一個共有屬性和一個私有屬性
self.num1 = 100
self.__num2 = 200
def __test(self):
print '私有方法'
print '%d %d' % (self.num1, self.__num2)
# 父類中定義了一個私有方法
class B(A):
def demo(self):
# 在子類的方法中,不能訪問父類的私有屬性
print '訪問父類的私有屬性 %d' % self.__num2
a = A()
print a
b = B()
print b
class A(object):
def __init__(self):
# 初始化定義了一個共有屬性和一個私有屬性
self.num1 = 100
self.__num2 = 200
def __test(self):
print '私有方法'
print '%d %d' % (self.num1, self.__num2)
# 父類中定義了一個私有方法
class B(A):
def demo(self):
# 在子類的方法中,不能訪問父類的私有屬性
print '訪問父類的私有屬性 %d' % self.__num2
b = B()
print b
b.demo()
如何讓私有屬性可以被子類訪問:
將其變為公有屬性:
class A(object):
def __init__(self):
# 初始化定義了一個共有屬性和一個私有屬性
self.num1 = 100
self.__num2 = 200
def __test(self):
print '私有方法'
print '%d %d' % (self.num1, self.__num2)
# 父類中定義了一個私有方法
def test(self):
print '%d' % self.__num2
self.__test()
class B(A):
def demo(self):
# 在子類的方法中,不能訪問父類的私有屬性
print '訪問父類的私有屬性 %d' % self.__num2
b = B()
print b
b.test()
# 讓私有屬性可以被子類訪問
相關推薦
基於python中的類屬性類結構及私有屬性私有方法
類 舊式類(經典類)和新式類 Python中類分兩種:舊式類和新式類: 新式類都從object繼承,經典類不需要。 新式類是自動呼叫object類的 python3.幾版本後可以自動呼叫基類(object類) 類的抽象化:類定義之後不呼叫是沒辦法輸出
Python中面向對向介紹及類的屬性和方法
1.面向物件介紹 類和物件:是面向物件中兩個重要概念 類:是物件對事物的抽象,比如人類\球類 物件:是類的一個例項,比如足球\籃球 例項說明: 球類可以對球的特徵和行為進行抽象,然後可以例項化一個真實的球體出來 為什麼面向物件? 面向物件的主要思想是 封裝
Python中如何獲取類屬性的列表
前言 最近工作中遇到個需求是要得到一個類的靜態屬性,也就是說有個類 Type ,我要動態獲取 Type.FTE 這個屬性的值。 最簡單的方案有兩個: ? 1 2 getattr(Type, 'FTE') Type.__dic
Python中直接訪問類的私有屬性或私有方法
首先我們定義一個包含私有屬性的類 class Foo(object): def init(self): self.__private = 521 例項化並嘗試訪問__private私有屬性, private_out = Foo() private_out.__p
Python與C++之間的相互呼叫例項3: 在Python中呼叫C++的結構體和類
之前在C++中寫的程式,絕大多數都是用類來封裝的。那麼現在想要在Python中進行呼叫,開始的時候是個頭疼的問題。經過將近一天的摸索學習,大概搞明白了一些。下面貼出來一個例子看一下。首先是C++的結構體和類:#pragma once #include <string&g
Java類文件結構及javac的ClassReader類解讀
ade add present ann oca max app contain sig 首先來看一下ClassFile,類註釋如下: A JVM class file. Generic Java classfiles have one additional at
python中的元類(metaclass)
優先 裝飾器 target {} pass get tac 搜索 items 認識python中元類的準備工作。 1,首先需要明白一個概念就是python中一切皆為對象。 input: class Trick(object): pass print type(‘1234
Python中的基本類型簡介
rip 作用 集合 成了 叠代 如果 增加 下劃線 等號 1、變量 變量不僅可以是數字,還可以是任意數據類型 命名規範:變量是用一個變量名表示,變量名必須是大小寫英文、數字和下劃線_的組合,且不能用數字開頭 python中等號“=”是賦值語句,可以把任意數據類型賦值給變量
python中數據類型轉換
lac 特殊字符 集合運算 子類 倒數 IE 發生 開始 ron 1、list轉str 假設有一個名為test_list的list,轉換後的str名為test_str 則轉換方法: test_str = "".join(test_list) 例子: 需要註意的是該
Python中的元類編寫ORM框架
部落格轉載: https://blog.csdn.net/givemefive_y/article/details/79806348 https://blog.csdn.net/eye_water/article/details/78777870 https://www.liaoxue
Python 中的 經典類、新式類比較(1)(關鍵詞:Python/經典類/新式類)
經典類中,屬性搜尋處理對所有路徑深度優先,直到繼承樹的頂端,然後從左到右進行; 新式類中,屬性搜尋處理沿著樹層級、以更加廣度優先的方式進行。 新式類的優點:可以避免重複搜尋超類。 直接上程式碼說明: # Python 2 class Super: attr = 0 cla
python中的元類解讀
在多數的程式語言中,類就是一組用來描述如何生成一個物件的程式碼段,但類也是物件。只要使用關鍵詞class。python直譯器在執行時就會建立一個物件。對於一個物件·:可做的操作:賦值給一個變數,拷貝,增加屬性,作為函式引數進行傳遞等。 類也是物件,可以在執行時動態的建立。對於動態的建立類,可以使
函式在python中是第一類物件——day11
函式在python中是第一類物件?1、可以被引用x=1y=xdef bar(): print('from bar')f=barf()2、可以當中引數傳入x=1def func(a): print(a)func(x)def bar(): print('from bar')def wrapper
python 中的元類
1. 類也是物件 在大多數程式語言中,類就是一組用來描述如何生成一個物件的程式碼段。在Python中這一點仍然成立: >>> class ObjectCreator(object): … pass … >>> my_object = Objec
python中的定製類(形如__xxx__的變數)很有意思
python中除了可以使用內建的型別,如list,tuple,dict,還可以建立自己的物件來實現像這些內建型別的訪問,不過需要在定義類的時候對一些魔法方法逐一實現。 1、__str__ 我們先定義一個Study類,列印一個例項: 打印出一堆<__main__>,不好看
python中抽象與類
前言: python中所有的資料都是以物件的形式存在,無論是簡單的數字型別還是複雜的程式碼模組。然而python特殊的語法形式巧妙的將實現物件機制的大量細節隱藏了,比如輸入num = 7就可以建立一個值為7的整數物件,並且將這個物件賦值給變數num。只是這個物件包含了加法,乘法之類
python 中 dict 在類中宣告的位置不一樣,結果有所差別
第一種宣告方式: class A(object): names = {} def output(self): print(self.names) class A1(A): pass class A2(A): pass
理解python中的元類
一,理解類也是物件 在python中類同樣也是一種物件,只要使用關鍵字class,Python直譯器在執行的時候就會建立一個物件,這個物件(類)自身擁有建立物件(類例項)的能力,這就是為什麼他是一個類的原因,但是,他的本質任然是一個物件。 class objectCreator(object):
深刻理解Python中的元類(metaclass)
譯註:這是一篇在Stack overflow上很熱的帖子。提問者自稱已經掌握了有關Python OOP程式設計中的各種概念,但始終覺得元類(metaclass)難以理解。他知道這肯定和自省有關,但仍然覺得不太明白,希望大家可以給出一些實際的例子和程式碼片段以幫助理解
python中自定義類
python中常用的自定類方法: 1.可以定義類和函式,然後自己通過類直接賦值,程式碼如下: 2.可以藉助MethodType實現,程式碼如下: 3.可以藉助type實現,程式碼如下: dir() 函式不帶引數時,返回當前範圍內的變數、方法和定義的型別列表;帶引數時,返回引數的屬性