一、编程思想
1、面向过程编程
遇到问题直接通过算法或者逻辑实现
2、函数式编程
遇到问题就想找一个、写一个拥有相应功能的函数
3、面向对象编程
遇到问题考虑可不可以有这样一个类来给我提供相应功能和数据;
以类和对象为工具
注意:python既支持函数式编程也支持面向对象编程
二、类和对象
1、什么是类,什么是对象
类就是拥有相同功能和相同属性的对象的集合;类是抽象的
对象就是类的实例;对象是具体的。
2、类的声明
类中的内容包含功能(函数)和属性(变量/属性)
a、语法
class 类名(父类):
类的内容
b、说明
class - python声明类的关键字
类名 - 要求:标识符,不能是关键字
规范:大驼峰式命名(骆峰式命名法就是当变量名或函式名是由一个或多个单字连结在一起,而构成的唯一识别字时,第一个单词以小写字母开始;第二个单词的首字母大写或每一个单词的首字母都采用大写字母,大驼峰第一个单词的第一个字母要大写)
: - 固定写法
类的内容 - 包含类的方法、属性和说明文档。方法就是声明在类里面的函数,属性就是声明在类里面的变量就是类的属性。
3、对象的声明
类名() - 创建指定的类的对象并且返回
同一个类可以创建多个对象。
三、对象方法
1、类中的方法
声明在类里面的函数就是方法,
类中的方法包括: 对象方法,类方法,静态方法
2、对象方法
a、什么是对象方法
直接声明在类里面的方法就是对象方法,有默认参数self
对象方法要通过对象来调用
b、参数self
当我们通过对象调用对象方法的时候,self不需要传参数,因为系统会自动把当前对象传给self。self谁调用对象方法self就指向谁。
注意:当前类的对象能做的事情self都能做。调用对象方法只需要给self以外的参数传参。
四、init方法和构造方法
1、init方法
__init__ 方法是类中的一个特殊的对象方法,专门用来对象创建的对象进行初始化。
当我们同过类创建对象的时候,系统就会自动调用init方法。
class Person:
# 类中__开头并且__结尾的方法叫魔法方法,不需要主动调用,系统会自动调用
def __init__(self):
2、构造方法
函数名和类名一样的函数就是构造方法。专门创建对象。
python中声明类的时候系统会自动创建这个类对应的构造方法。
当我们构造方法的时候内部会在内存中开辟空间保存对象。然后用创建的这个对象去调用init方法,用来对对象进行初始化,init方法调用结束后,返回对象。
注意: 如果类的init方法除了self以外还有其他参数,那么我们在创建对象的时候需要通过给构造方法来给init方法传参
五、对象属性
类中的属性分为类的字段和对象属性
1、对象属性
属性的值会因为对象不同而不一样,这种属性就应该声明为对象属性。
位置 - 声明在init方法中
方式 - 以'self.属性 = 值'的方式来声明(这里的属性就是对象属性)
使用 - 通过'对象.属性'的方式来使用
class Person:
def __init__(self):
self.name = '张三'
self.age = 18
p1 = Person()
2、类的字段
直接声明类里面函数的外面的变量就是类的字段。属性值不会因为对象不同而不同,这种属性就声明成类的字段。
以 '字段名 = 值'
通过'类.字段'的方式来使用
六、对象属性的增删改查
1、查
对象.属性 - 获取执行对象属性值;当属性不存在的时候会报错
getattr(对象, 属性名:str, 默认值) - 获取指定对象指定属性值,当属性不存在的时候有默认值则则不会报错,并且返回默认值。
print(p1.name)
print(getattr(p1, 'name'))
print(getattr(p1, 'small_name', '小红'))
注意:当属性不确定的时候可以使用getattr
2、增,改
对象.属性 = 值 - 当属性存在的时候修改属性的值;属性不存在的时候添加属性。
setattr(对象, 属性名, 值) - 当属性存在的时候修改属性的值;属性不存在的时候添加属性。
3、删
del 对象.属性
delattr(对象, 属性名)
del p1.sex
delattr(p1, 'age')
4、__slots__魔法
约束当前类的对象最多能拥有哪些属性,建议不用。
class Dog:
__slots__ = ('name', 'color')
def __int__(self, name = '', color = '黑色')
self.name = name
self.color = color
self .age = 10
七、内置属性
内置属性指的是系统自动给我们添加的属性(其实是通过继承获取到的)
1.类.__name__(返回的是字符串)
2.对象.__class__
3.类.__doc__
4.对象.__dict__
5.类.__module__
6.类.__base__
class A:
"""说明文档"""
num1 = 2
def __init__(self, name = 'ququ', age = 22):
self.name = name
self.age = age
a = A()
print('A.__name__:',A.__name__)
print('==========module==============')
print('a.__module__:',a.__module__)
print('A.__module__:', A.__module__)
print('==========base==============')
print('A.__bases__:', A.__bases__)
print('==========class==============')
print('a.__class__',a.__class__)
print('A.__class__', A.__class__)
print('==========doc==============')
print(a.__doc__)
print(A.__doc__)
print('==========dict==============')
print('a.__dict__:',a.__dict__)
print('A.__dict__:', A.__dict__)
输出结果:
A.__name__: A
==========module==============
a.__module__: __main__
A.__module__: __main__
==========base==============
A.__bases__: (,)
==========class==============
==========doc==============
说明文档
说明文档
==========dict==============
a.__dict__: {'name': 'ququ', 'age': 22}
A.__dict__: {'__module__': '__main__', '__doc__': '说明文档', 'num1': 2, '__init__': , '__dict__': , '__weakref__': }
八、类方法和静态方法
1、对象方法
a、怎么声明
直接声明类
b、特点
自带self参数,调用的时候不用传参,谁调用指向谁
c、怎么调用:对象.方法()
2、类方法:
a、怎么声明
声明函数前加@classmethod
b、特点
自带默认参数cls,调用的时候不用传参,系统会自动将调用当前函数的类传给他(cls是谁调用就执行谁,类方法只能通过类来调用)
c、怎么调用
通过类来调用,类.方法()
3、静态方法
a、怎么声明
声明函数前加@staticmethod
b、特点
没有默认参数
c、怎么调用
通过类来调用,类.方法()
4、在类中怎么选择使用哪种方法:
如果类中函数的功能需要使用对象的属性那么这个函数就要声明为对象方法。
实现函数的功能不需要对象属性的前提下,如果需要类的字段,就声明成类方法。
实现函数的功能既不需要对象属性也不需要类的字段就声明成静态方法。