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