1. 程式人生 > >基於python中的類屬性類結構及私有屬性私有方法

基於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() 函式不帶引數時,返回當前範圍內的變數、方法和定義的型別列表;帶引數時,返回引數的屬性