天天看點

Python面向對象基礎Python面向對象基礎

Python面向對象基礎

1.程式設計思想

面向過程程式設計、函數式程式設計、面向對象程式設計

# 程式設計實作功能:1*2*3*..*10
# 面向過程程式設計:
s = 1
for x in range(1, 11):
    s *= x
print(s)

# 函數式程式設計:
from math import factorial
print(factorial(10))


# 面向對象程式設計
class Math:
    @staticmethod
    def factorial(num: int):
        s = 1
        for x in range(1, num+1):
            s *= x
        return s

print(Math.factorial(10))
           

2.類和對象

  1. 什麼是類、什麼是對象

    類:擁有相同功能相同屬性的對象的集合 (抽象的概念)

    對象:對象是類的執行個體(具體的事物)

    從生活的角度了解類和對象:

    人是類,小紅就是對象、小明是另外一個對象

    杯子是類,我桌上這個杯子就是對象

  2. 建立類和建立對象

    1)建立類 - 就是用代碼描述清楚這個類是擁有哪些相同功能(函數)和哪些相同屬性(變量)的對象的集合

    文法:

    class 類名:

    類的說明文檔

    類的内容

    說明:

    class - 關鍵字;固定寫法

    類名 - 程式員自己命名;

    要求:辨別符、不是關鍵字

    規範:見名知義;駝峰式命名,并且第一個字母大寫;不使用系統的函數名、類名、子產品名

    : - 固定寫法

    類的說明文檔 - 多行注釋

    類的内容 - 包含屬性和方法

    屬性:類屬性(類的字段)、對象屬性

    方法:對象方法、類方法、靜态方法

    注:方法是定義在類中的函數

    1. 建立對象

    文法:

    類名()

    # 建立類
    class Person:
        """類的說明文檔"""
        # 屬性
        # 方法
        pass
    
    # 建立對象
    p1 = Person()
    print(p1)
    
    p2 = Person()
    print(p2)
               

3.方法

  1. 方法 - 定義在類中的函數

    1)對象方法

    a.怎麼定義:直接定義在類中

    b.怎麼調用:對象.

    c.特點:有個預設參數self,self不用傳參,誰調用self就指向誰

    d.什麼時候用:如果實作函數的功能需要用到對象屬性,就将定義成對象方法

    2)類方方法

    a.怎麼定義:定義函數前加裝飾 @classmethod

    b.怎麼調用:類.

    c.特點:有個預設參數cls,調用時候不用傳參,系統自動将目前類傳給cls

    d.什麼時候用:在不需要對象屬性的前提下,需要類

    3)靜态方法

    a.怎麼定義:定義函數前加裝飾器 @staticmethod

    b.怎麼調用:類.

    c.特點:沒有預設參數

    d.什麼時候用:在不需要對象屬性的前提下,也不需要類

    class A:
        def func1(self):
            print('對象方法')
            print(A)
    
        @classmethod
        def func2(cls):
            print(f'cls:{cls}')
            print('類方法')
            b = cls()
            print(f'b:{b}')
    
        @staticmethod
        def func3():
            print('靜态方法')
    
    
    a = A()   # 對象方法
    a.func1()  # <class '__main__.A'>
    
    print(f'A:{A}')  # A:<class '__main__.A'>
    A.func2()   
    '''
    cls:<class '__main__.A'>
    類方法
    b:<__main__.A object at 0x000001B5B7098FD0>
    '''
    
    A.func3()   #靜态方法
               
  2. __init__方法 - 初始化方法

1)構造方法: 函數名和類名相同,用來建立對象的函數就是構造函數(構造方法)

python的構造函數,需要程式員自己寫,建立類的時候系統會自動建立這個類的構造函數

2)初始化方法:

a. 當通過類建立對象的時候系統會自動調用__init__方法

b. 在調用調用構造函數建立對象的時候,需不需要參數需要幾個參數看對應的__init__除了self以外有

沒有額外的參數,有幾個額外的參數。

c. 程式員在類中添加__init_方法的時候隻需要保證方法名是__init__有預設參數self就可以。

形參和函數體可以根據情況随便添加

補充:前後都有兩個下劃線的方法又叫魔法方法,這類方法不需要程式員去調用,在特定情況下會被自動調用

class Dog:
    def __init__(self, x=9):
        print('初始化方法')


p1 = Dog(10)  #初始化方法
p2 = Dog(x=20)  # 初始化方法
p3 = Dog()   # 初始化方法
           

4.屬性

  1. 屬性 - 定義在類中的變量
    1. 類屬性

    a.怎麼定義: 直接定義類中的變量

    b.怎麼使用: 通過 ‘類.’ 的方式來使用

    c.什麼時候用: 屬性值不會因為對象不同而不一樣

    1. 對象屬性

    a.怎麼定義:以 ‘self.屬性名 = 值’ 的形式定義在__init__方法中

    b.怎麼使用:以 '對象.'的方式來使用

    c.什麼時候用: 屬性值會因為對象不同而不一樣的時候就使用對象屬性

    class Circle:
        # a 是類屬性
        a = 10
        # pi 是類屬性
        pi = 3.1415926
    
        # radius是對象屬性
        def __init__(self):
            self.radius = 1
    
    
    # 使用類屬性
    print(Circle.a)
    
    c1 = Circle()
    # 使用對象屬性
    print(c1.radius)
               
  2. 對象屬性的初始值
    class Person:
        def __init__(self, name, gender='男'):
            self.name = name
            self.gender = gender
            self.age = 0
    
    
    p1 = Person('小明')
    p2 = Person('張三')
    p3 = Person('小花', '女')
    
    print(p1.name, p1.gender)
    print(p2.name, p2.gender)
    print(p3.name, p3.gender)
               
  3. 在對象方法中對象屬性的使用
    class Circle:
        pi = 3.1415926
    
        def __init__(self, radius):
            self.radius = radius
    
        def area(self):
            # 如果在實作對象方法的功能的時候需要用到對象屬性,由self來提供這個對象屬性
            # return 圓周率 x 圓半徑的平方
            return Circle.pi * self.radius ** 2
    
    c1 = Circle(2)
    c2 = Circle(4)
    
    print(c1.area())
    print(c2.area())
    
               

練習

  1. 定義一個狗類和一個人類:

    狗擁有屬性:姓名、性别和品種 擁有方法:叫喚

    人類擁有屬性:姓名、年齡、狗 擁有方法:遛狗

    class Dog:
        def __init__(self, name, gender, breed):
            self.name = name
            self.gender = gender
            self.breed = breed
    
        def func1(self):
            return (f'{self.name}在叫喚')
    
    
    class Person:
        def __init__(self, name, age):
            self.name = name
            self.age = age
            self.dog = None
    
        def func2(self):
            if self.dog:
                return (f'{self.name}在遛{self.dog.name}')
            else:
                return ('沒有狗,自己散步')
    
    
    p1 = Person('小米', '11')
    p1.dog =Dog('七七', '公', '柯基')
    print(p1.func2())
               
  2. 定義一個矩形類,擁有屬性:長、寬 擁有方法:求周長、求面積
    class rectangle:
        def __init__(self,length, width):
            self.lenget =length
            self.width =width
        def perimeter(self):
            return (self.width +self.lenget)*2
        def ares(self):
            return self.width *self.lenget
    
        
    p1 =rectangle(5,6)
    print(p1.ares())
    print(p1.perimeter())
               
  3. 定義一個二維點類,擁有屬性:x坐标、y坐标 擁有方法:求目前點到另外一個點的距離
    class TwoDimension:
        def __init__(self, x, y):
            self.x = x
            self.y = y
    
        def distance(self, other):
            return ((self.x - other.x) ** 2 + (self.y - other.y) ** 2) ** 0.5
    
    
    p2 = TwoDimension(3, 4)
    p3 = TwoDimension(0, 0)
    print(p2.distance(p3))
               
  4. 定義一個圓類,擁有屬性:半徑、圓心 擁有方法:求圓的周長和面積、判斷目前圓和另一個圓是否外切
    class Circle:
        pi = 3.14
    
        def __init__(self, radius,center=TwoDimension(0,0)):
            self.radius = radius
            self.center =center
    
        def ares(self):
            return Circle.pi * self.radius ** 2
    
        def perimeter(self):
            return 2 * Circle.pi * self.radius
    
        def excircle(self,other):
             return self.radius+other.radius ==self.center.distance(other.center)
    
    p1 =Circle(8,center=TwoDimension(3, 4))
    p2 =Circle(5,center=TwoDimension(3, 4))
    print(p1.excircle(p2))
    
               
  5. 定義一個線段類,擁有屬性:起點和終點, 擁有方法:擷取線段的長度
    class Segment:
    
        def __init__(self, start=TwoDimension(0,0), end=TwoDimension(0,0)):
            self.start = start
            self.end = end
    
        def length(self):
            return self.start.distance(self.end)
    
    p1 =Segment(start=TwoDimension(0,0),end=TwoDimension(9,9))
    print(p1.length())