天天看點

day17 - 面向對象基礎day17 - 面向對象基礎

day17 - 面向對象基礎

1,程式設計思想

程式設計思想:面向過程程式設計(窮人思想),函數式程式設計(小資),面向對象程式設計(富豪)

from math import factorial
print(factorial(10))

class Math:
    @staticmethod
    def factoroal(num:int):
        s = 1
        for x in range(1,num+1):
            s *= x
        return s
    @staticmethod
    def cube(num):
        return num ** 3

print(Math.factoroal(10))
           

2,類和對象

1) 什麼是類,什麼是對象

"""
什麼類:擁有相同功能相同屬性的對象的集合  (抽象的概念)
什麼對象:對象是類的執行個體  (具體的事物)

從生活的角度了解類和對象:
人是類,冬風就是對象,東風就是另外一個對象
杯子是類,我桌子上的這個杯子就是對象
"""
           

2)建立類和對象

"""
1) 建立類  -  就是用代碼描述清楚這個類是擁有哪些相同功能(函數)和哪些相同屬性的對象的集合
文法:
class 類名:
    類的說明文檔
    類的内容

說明:
class  -  關鍵字;固定寫法
類名    -  程式員自己命名;
           要求:辨別符,不是關鍵字
           規範:見名知義;駝峰式命名,并且第一個字母大寫;你使用系統的函數名,類名,子產品名
:  -  固定寫法
類的說明文檔  -  多行注釋
類的内容  -  包含屬性和方法
            屬性:類屬性(類的字段),對象屬性
            方法:對象 方法,類方法,靜态方法

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

2)建立對象
文法:
類名()
"""
           
#建立類
class Person:
    """
   類的說明文檔
    """
    #屬性
    #方法
    def eat(self):
        print('吃東西!')


#建立對象
p1 = Person()
print(p1)

p2 = Person()
print(p2)
           

4,對象方法

什麼是對象方法

"""
1)怎麼定義
直接定義在類中的函數就是對象方法

2)怎麼調用:通過'對象.'的形式來調用


3)特點
有預設參數self,這個參數在調用的時候不用傳參,系統會自動将目前對象傳給self(誰調用就指向誰)

"""
           
class Student:
    def study(self):
        print(f'self:{self}')
        print('學習!')
    def eat(self,food):
        print(f'吃{food}')

stu1 = Student()
stu2 = Student()
print(f'stu1:{stu1}')
print(f'stu2:{stu2}')
stu1.study()
stu1.eat('米飯')
           

4,init方法

1),__init__方法 - 初始化方法

"""
1)構造方法:函數名和類名相同,用來建立對象的函數就是構造函數(構造方法)
python的構造函數不需要程式員自己寫,建立類的時候系統會自動建立這個類的構造函數

2)初始化方法:
a,當通過類建立對象的時候系統會自動調用__init__方法
b,在調用構造函數建立對象的時候,需不需要參數需要幾個參數看對應的__init__除了self以外有沒有額外的參數,有有幾個額外的參數
c,程式員在類中添加__init__方法的時候隻需要保證方法名是__init__有預設參數self就可以
   形參和函數體可以根據情況随便添加 


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


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


p1 = Dog()
p2 = Dog(x=20)
p3 = Dog(10)
           

5,屬性

屬性 - 定義在類中的變量

"""
1)類屬性
a,怎麼定義:直接定義類中的變量
b,怎麼使用:通過'類.'的方式來使用
c,什麼時候使用:屬性值不會因為對象不同而不一樣

2)對象屬性
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)

#屬性對象點的初始值
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)

#在對象方法中對象屬性的使用

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())
           

6,方法

方法 - 定義在類中的函數

"""
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('對象方法')

    @classmethod
    def func2(cls):
        print(f'cls:{cls}')
        print('類方法')
        b = cls()
        print(f'b:{b}')

    @staticmethod
    def func3():
        print('靜态方法')

a = A()
a.func1()

print(f'A:{A}')
A.func2()

A.func3()


class Math:
    @staticmethod
    def sum(a,b):
        print(a+b)
        return a+b

print(Math.sum(1,2))