1. 程式人生 > >面向對象 成員和嵌套

面向對象 成員和嵌套

所在 row each 輸入 ddr base 類變量 ini 私有化

成員和嵌套(建模)

一、成員分為三類:

  1.實例變量(字段)

  公有和私有實例變量(字段)

  2.類變量(靜態字段)

  公有和私有類變量(靜態字段)

二、嵌套

1.公有實例變量(字段):

class Foo:
    def __init__(self,name):
        self.name=name
        self.age=123
    def func(self):
        print(self.name)
ojb=Foo(jjj)
print(ojb.name)
print(ojb.age)
ojb.func()


jjj
123
jjj

私有實例變量(字段):

class Foo:
    def __init__(self,name):
        self.__name=name
        self.age=123
    def func(self):
        print(self.__name)
obj=Foo("你是誰")
print(obj.age)
obj.func()
註意:當他私有化的時候,print(obj.__name),會報錯,拿不到__name的值,只能借助obj,func()從內部取到

類變量(靜態字段)的公有:

class foo:
country="中國"
def __init__(self):
pass
def func(self):
print(self.country)
print(foo.country)#一般使用這個
print(foo.country)#調用外部
obj=foo()
obj.func()#通過內部的func調用
 中國 中國 中國

類變量(靜態字段)的私有:

class foo:
    __country="中國"
    def __init__(self):
        pass
    def func(self):
        # print(self.__country)
        print(foo.__country)#一般使用這個
# print(foo.__country)#調用外部會報錯,因為私有
obj=foo()
obj.func()#通過內部的func調用

準則:實例變量(字段)訪問時,使用對象訪問:obj.name

   類變量(靜態字段)訪問時,使用類方法foo.country(實在不方便時才會使用self.country)

知識點:什麽時候要用變量呢?

當所有對象中有共同的字段且都要修改或者刪除的時候,可以將實例變量(字段)提取到類變量(靜態字段)

如何從繼承中獲取類變量私有中的內容呢?

class Base:
    __secret ="受賄"
    def zt(self):
        print(Base.__secret)
class foo(Base):
    def func(self):
        print(self.__secret)
        print(foo.__secret)
obj=foo()
obj.zt()
#若果沒有zt函數,是不會獲取到父級裏的__secret的,在繼承中要有表現的話才會獲取到

實例方法的靜態方法使用:

class foo(object):
    def __init__(self,name):
        self.name=name
    def func(self):
        print(self.name)
    @staticmethod#靜態方法:如果方法無需使用對象中的值得話,就使用靜態方法
    def display(a,b):
        return a+b
obj=foo("lll")
obj.func()
print(obj.display(1,9))

lll
10

靜態方法的使用:

1.編寫:

方法上面寫@staticmethod

方法的參數可有可無

2.調用時:

類名.方法名或者對象.方法名

3.啥時候寫靜態方法:

不調用對象中封裝的值得時候

實例方法的類方法使用:

class foo:
    def __init__(self,name):
        self.name=name
    def func(self):
        print(self.name)
    @staticmethod#靜態方法
    def disliay(a,b):
        return a+b
    @classmethod#類方法
    def show(cls,c,d):
        print(cls,c,d)
foo.show(1,9)

<class __main__.foo> 1 9

類方法的使用:

1.定義時:

方法上寫@classmethod

方法的參數:至少有一個cls參數

2.執行的時候

類名.方法名()#默認會將當前類傳到參數裏

3.啥時候用?

如果在方法中會用到當前類,那麽就使用類方法

私有的實例方法

class fool:
    def __init__(self):
        pass
    def __display(self,xxx):
        print("siyou ",xxx)
    def func(self):
        self.__display(123)
obj=fool()
obj.func()

siyou  123

私有的靜態方法

class Foo(object):
    def __init__(self):
        pass
    @staticmethod
    def __display(arg):
        print(私有靜態 方法,arg)
    def func(self):
        Foo.__display(123)
    @staticmethod
    def get_display():
        Foo.__display(888)
# Foo.__display(123) 報錯
obj = Foo()
obj.func()
Foo.get_display()


私有靜態 方法 123
私有靜態 方法 888

屬性

class Foo(object):
    def __init__(self):
        pass
    @property
    def start(self):
            return 1
    @property
    def end(self):
            return 10
obj = Foo()
print(obj.start)
print(obj.end)

1
10

屬性總結:

編寫的時候,方法上寫@property,方法參數只有一個self。

調用的時候無需加括號,對象.方法

應用場景:對於簡單的方法,無需傳參且沒有返回值的時候,可以使用@property

練習題:翻頁

2

普通版:
date_lst=[] for i in range(1,901): date_lst.append("alex_%s頁" %i ) while 1: page=int(input("請輸入你要查看的頁碼")) per_page_num=10 start=(page-1)*per_page_num end=page*per_page_num page_list=date_lst[start:end] for el in page_list: print(el) 面向對象版:
class Pagenation(object):
"""
處理分頁相關的代碼
"""

def __init__(self,data_list,page,per_page_num=10):
"""
初始化
:param data_list: 所有的數據
:param page: 當前要查看的頁面
:param per_page_num: 每頁默認要顯示的數據行數
"""
self.data_list = data_list
self.page = page
self.per_page_num = per_page_num

@property
def start(self):
"""
計算索引的起始位置
:return:
"""
return (self.page-1) * self.per_page_num

@property
def end(self):
"""
計算索引的結束位置
:return:
"""
return self.page * self.per_page_num

def show(self):
result = self.data_list[self.start:self.end]
for row in result:
print(row)


data_list = []

for i in range(1, 901):
data_list.append(‘alex-%s‘ % i)

while True:
# 1. 要查看的頁面
page = int(input(‘請輸入要查看的頁碼:‘))
obj = Pagenation(data_list,page)
obj.show()


嵌套:

"""
創建三個學校且三個學校的設施內容等都是一致.
"""

class School(object):
    def __init__(self, name, address):
        self.name = name
        self.address = address

    def speech(self):
        print(講課)

obj1 = School(老男孩北京校區, 美麗富饒的沙河)
obj2 = School(老男孩上海校區, 浦東新區)
obj3 = School(老男孩深圳校區, 南山區)
class Teacher(object):
    def __init__(self, name, age, salary):
        self.name = name
        self.age = age
        self.__salary = salary
        self.school = None

t1 = Teacher(李傑, 19, 188888)
t2 = Teacher(TT, 18, 60)
t3 = Teacher(女神,16, 900000)
# ############## 老師分配校區
t1.school = obj1
t2.school = obj1
t3.school = obj2
# ####################################
# 查看t1老師,所在的校區名稱/地址
print(t1.school.name)
print(t1.school.address)
print(t1.name)
print(t1.age)
t1.school.speech()

面向對象 成員和嵌套