面向对象基础
- 编程思想
# 编程思想
# 三种编程思想:
# 1.面向过程编程
# 2.函数式编程
# 3.面向对象编程
# 练习:计算8的阶乘
# 方法一:
s = 1
for x in range(1,9):
s *= x
print(s)
import math
print(math.factorial(8))
- 认识类和对象
# 1. 什么类,什么是对象
'''
类 - 类是对拥有相同功能和相同属性的对象的集合(是一个抽象的概念)
对象 - 对象是类的实例(具体表现)
从生活的角度: 如果人是类,某个具体的人就是对象,另一个就是另一个对象
如果杯子是类,具体的杯子就是对象
'''
# 2.程序中定义类(创建) - 用代码来描述清楚这个是到底是拥有哪些相同功能的和哪些相同属性的对象的集合
# 功能 - 函数
# 属性 - 属性(保存数据的变量)
'''
语法:
class 类名:
类的说明文档
类的内容(包括类的属性和方法)
注解:方法 - 定义在类中的函数
属性 - 定义类中变量
说明:
class - 关键字:固定写法
类名 - 自己命名,必须符合要求
要求:是标识符 不能是关键字
规范:见名知义;采用驼峰式命名(由多个单词组成,单词之间通过首字母大写区分),第一个字母大写
不使用系统函数名类名或者模块名
类的说明文档 - 本质就是多行注释
类的内容 - 包含方法和属性组成
方法包括:对象方法,类方法和静态方法三种
属性包括: 类属性和对象属性两种
'''
class Student:
'''学生类'''
pass
class Dog:
'''学生类'''
pass
# 3.创建对象
# 对象是类的实例,创建对象必须通过类来创建.
'''
语法:
对象 = 类名()
'''
# 创建两个学生类的对象
s1 = Student()
s2 = Student()
print(s1,s2)
# 创建一个狗的对象
dog = Dog()
print(dog)
- 方法
# 类中方法包含三种:对象方法.类方法.静态方法
# 1.对象方法
'''
1)怎么定义:直接定义在类中的函数就是对象方法
2)怎么调用:通过对象来调用 - 对象.对象方法()
3)特点:用对象调用对象方法的时候,参数self不需要传参,系统会自动将当前对象传给self
'''
# 2.类方法
'''
1)怎么定义:加@classmata装饰器定义函数前
2)怎么调用:通过类来调用 - 类.类方法()
3)特点:参数cls不需要传参,系统会自动将当前类传给cls
'''
# 3.静态方法
'''
1)怎么定义: 加@staticmethod定义函数前
2)怎么调用:通过类来调用 - 类.类方法()
3)特点:没有特点
'''
class A:
'''无意义的类'''
def func1(self):
print('对象方法',self)
@classmethod
def func2(cls):
print('类方法')
@staticmethod
def func3():
print('静态方法')
#
aaa = A()
print(aaa) #<__main__.A object at 0x00000206A0647F10>
aaa.func1() #对象方法#对象方法 <__main__.A object at 0x00000206A0647F10>
A.func2() # 类方法
A.func3() # 静态方法
# 4. 类中函数的参数
class B:
def func1(self,x,y=10):
print(f'x:{x},y:{y}')
@classmethod
def func2(cls,x,*,y,z):
print(f'x:{x},y:{y},z:{z}')
@staticmethod
def func3(x,y):
print(x,y)
b = B()
b.func1(100)
b.func1(100,200)
b.func1(x=11,y=12)
B.func2(10,y=20,z=30)
- 构造函数和init方法
# 1.构造函数 - 名字和类名一样,专门用来创建对象的函数
# python中创建类的时候,系统会自动创建这个类的构造函数
#补充:魔法方法
# 1)方法名是两个下划线开头两个下划线结尾
# 2)系统会自动调用,不需要主动调用,在特定时间被触发后系统会自动调用
# 2.__init__方法
'''
当通过类创建对象的时候,类中__init__方法会被自动调用
(每次通过类创建对象的时候,类中的__init__都会被自动调用)
'''
class Student:
def __init__(self):
print('init方法')
stu = Student()
stu1 = Student()
# 2)
'''
通过类创建对象的时候需不需要参数,需要几个参数,由这个类中的__init__决定.看除了self有几个参数
'''
class Dog:
def __init__(self,x,y):
print('init方法:',x,y)
dog1 = Dog(10,20)
dog2 = Dog(x=100,y=200)
- 属性
# 属性分为:对象属性和类属性(字段)
# 1.类属性
'''
怎么定义:直接在类中定义一个变量,这个变量就是类属性
怎么使用:通过类来使用 - 类.类属性
什么时候用:属性值不会因为对象不同而不一样就将这个属性定义为类属性
'''
# 2.对象属性
'''
怎么定义:以'self.属性名=值'的形式定义在__init__方法中
怎么使用:通过对象来使用 - 对象.对象属性
什么时候用:属性会因为对象不同而不一样就将这个属性定义成对象属性
'''
class A:
# x是类属性
x = 100
# y是对象属性
def __init__(self):
self.y=200
print('s')
A.x =200
print(A.x)
a1 = A()
print(a1.y)
a1.y =300
print(a1.y)
class Circle:
pi = 3.1415926
def __init__(self):
self.r = 0
# 3.__init__方法的拓展
# 1)如果类需要对象属性,就需要在类中加__init__
# 2)可以通过在__init__中添加参数来实现创建对象的时候直接给属性赋值的目的
class Student:
def __init__(self,name,gender = '男'):
self.name = name
self.gender = gender
self.age = 0
p1 = Student('小花','女')
p2 = Student('张三')
print(p1.name,p1.gender)
print(p2.name,p2.gender)
- 方法和选择
# 1.选择
# 如果实现函数的功能需要对象(对象属性)就用对象方法;如果需要类就用类就类方法;不需要就用静态方法
# 2.对象方法的使用
class Rect:
def __init__(self,width=0,height=0):
self.width = width
self.height = height
self.area = width * height
r1 = Rect(10,20)
print(r1.width,r1.height,r1.area)
r1.width = 100
print(r1.width,r1.height,r1.area) # 这样写面积没变
class Rect11:
def __init__(self,width=0,height=0):
self.width = width
self.height = height
def area(self):
return self.width*self.height
rr1 = Rect11(10,20)
rr2 = Rect11(5,8)
print(rr2.area())
# 练习:定义一个圆类,拥有属性半径和圆周率,拥有方法:求面积和求周长
class Circle:
def __init__(self,r):
self.pi = 3.1415926
self.r = r
def area(self):
#这个类的对象能做的事情,self都可以做
return self.r*(self.pi**2)
def length(self):
return self.r*2*self.pi
ri = Circle(2)
print(ri.area(),ri.length())
# 这个圆周率最好是写成类属性,不然不合实际就是Circle.pi来调用