12 物件導向基礎-1

weixin_33871366發表於2018-07-31

生成器(擴充套件)

生成器可以看做是一個容器.當程式需要對應的資料的時候才去裡面拿取資料,生成器中資料只能一個一個生成,不能跳過,一個資料只生成一次,已生成的資料無法再生成.
資料的獲取:    _ _ next _ _()方法
注:1.只要函式宣告中有yield關鍵字,則函式就變成了一個生成器.

  1. 生成器和其他資料容器不同,生成器儲存在記憶體空間裡的是產生資料的演算法,並沒有儲存具體的資料,使得它佔用空間很小.
    例項:利用生成器生成一個斐波那契數列
def xu_lie(n):
    pre1 = 1
    pre2 = 1

    for i in range(1, n+1):
        if i == 1 or i == 2:
            current = 1
            yield current
        else:
            pre1, pre2 = pre2, current
            yield current

xulie = xu_lie(10)

print(xulie.__next__())
print(xulie.__next__())
print(xulie.__next__())

# 1
# 1
# 2

1.物件導向的基本概念

(1)基於物件導向的程式設計, 面對問題考慮有沒有相應的物件來解決這個問題 --> 工具: 類和物件
(2)類: 對擁有共同屬性和方法的物件的封裝.類是抽象的.(比如:人類)
(3)物件:物件就是類的具體例項,是具體的事物.而且物件的屬性是確定的 (比如:一個叫小明的人類)

2.宣告類和物件

(1)宣告類

class 類名(父類):
    屬性
    方法

注意:

  • 類的命名首字母要大寫
  • 括號裡為要繼承的父類,預設為空
  • 屬性:物件的屬性,或者是類的欄位
  • 方法:就是在類裡面宣告函式,實現某種功能
    def eat(self):
        print(self, '在吃飯')

    def sleep(self):
        print(self, '在睡覺(¦3[▓▓] 晚安')

物件方法預設都有一個self引數,這個引數在方法被呼叫的時候不用傳參(系統會自動傳參),誰來呼叫這個方法,那self就指向誰.

(2)宣告物件

物件名 = 類名()

即通過類的構造方法去建立一個物件, 生成的物件可以使用xx.xx語法使用類中宣告的物件的方法和屬性

3.物件的屬性

物件的屬性的宣告

class 類名:
    def __init__(self,引數1, 引數2,引數...):
    self.屬性名 = 初值
    self.屬性2 = 初值2

_ _ init _ _():方法是初始化物件的屬性,是系統自帶的方法,再通過構造方法建立物件的時候除了self,其他引數都必須有值.

class People:
    def __init__(self, name1='', age1=0, sex1='女'):
        # 在這個地方宣告物件的屬性
        print('---')
        print(name1)
        # 在init方法中宣告物件的屬性
        """
        name,age,和sex就是Person這個類的物件屬性.類的物件屬性,需要通過物件來使用
        """
        self.name = name1
        self.age = age1
        self.sex = sex1
        self.flag = '1'

4.物件屬性的增刪改查

class Dog:
    """狗類"""
    def __init__(self, age='0', color='color'):
        self.age = age
        self.color = color

dog1 = Dog(3, 'white')

(1).查

# 方法一:
dog1.age, dog1.color
# 方法二:
dog1.__getattribute__('age')
# 方法三:
getattr(dog1, 'age')    # getattr(物件,屬性名,預設值(預設值可以防止報錯,可省略))

(2).改

# 方法一:
dog1.color = 4
# 方法二:
dog1.__setattr__('color', 'black')
# 方法三:
setattr(dog1, 'color', 'blue')

(3).增

# 方法1:
dog1.name = '大黃'
# 方法2:
dog1.__setattr__('type', '哈士奇')
# 方法三:
setattr(dog1, 'sex', '公')

(4)刪

# 方法1:
del dog1.age
# 方法2:
dog1.__delattr__('age')
# 方法三:
delattr(dog1, 'color')

5.slots魔法

slots可以對物件的屬性進行限制(約束),防止後面給物件新增的屬性寫錯了.
slots一般寫在開頭類的宣告的下面一行
如果在後面給物件新增一個slots以外的屬性,則會報錯.

class Person:
    __slots__ = ('name', 'age', 'sex')

以上說明:Person類,只能有name,age,sex三個屬性,如果在後面給物件新增屬性的時候不在slots裡,則會報錯.

6.類中的方法

(1).屬性:
  • a.類的屬性:累的屬性宣告在類裡面,函式外面,類的屬性屬於類,類的欄位通過類呼叫
  • b.物件的屬性:物件的屬性寫在init方法裡面,通過物件呼叫
(2).方法:
  • a.物件的方法:自帶一個self引數,一般通過物件去呼叫
  • b.類的方法:
    (1)使用@classmethod修飾,自帶一個cls引數(同self原理),不用傳參,誰來呼叫這個方法,這個cls指向誰
    (2)每新建一個類方法,就需用@classmethod要修飾一次.
    (3)類方法就要通過類去呼叫
  • c.靜態方法:
    (1)使用@classmethod修飾
    (2)沒有預設引數
    (3)呼叫的時候,是通過類來呼叫的
    例項:
class Person:
    # number是類欄位
    number = 0

    def __init__(self, name='', age=0):
        # name 和 age是物件屬性
        self.name = name
        self.age = age

    def eat(self, food):
        print('%s正在吃%s' % (self.name, food))

    @classmethod
    def hurt_earth(cls):
        # cls指向的是呼叫這個方法的類,cls可以當成類來使用
        print('人類破壞環境!!!')

        # 使用cls建立物件
        pt = cls()
        print(pt)

        # 也可以通過cls使用類的欄位
        print(cls.number)

    @staticmethod
    def protect():

        print('人類保護地球')


if __name__ == '__main__':
    # 類的屬性,通過類來使用
    print(Person.number)

    # 物件的屬性,通過物件來使用
    p1 = Person('小明')
    print(p1.name, p1.age)

    # 物件的方法要通過物件來使用
    p1.eat('南瓜')

    # 類的方法要通過類來使用
    Person.hurt_earth()

    # 靜態方法通過類來呼叫
    Person.protect()

相關文章