1.类的定义和创建
类=变量+方法
类的封装性:把数据和操作封装在一起,使程序结构更加清晰。
(pass 空语句,起到占位作用)
class Student: #定义
stu=Student() #创建
2.类属性定义及其访问
class Student:
name='xxx'
#定义
访问:通过类名访问and通过类对象访问
类名或对象名.属性名
plus:Python是一种动态语言,除了可以在定义类时指定类属性外,还可以动态地绑定新的属性。
class Student:
......
if__name_=='__main__':
stu1=Student()
stu2=Student()
stu1.age=19 #动态绑定新的属性
3.类的方法
普通方法:需要通过类的实例对象根据方法名调用
要求第一个参数需要对应调用方法时所使用的实例对象。(self)
plus:
1)在通过类的实例对象调用类中的普通方法时,并不需要传入self。
2)普通方法必须通过实例对象调用,而不能通过类名调用。(因self的隐式传递)
内置方法:在特定情况下由系统自动执行
常用的内置方法:
__str__:调用str函数对类对象进行处理时或者调用Python内置函数format()和print()时自动执行,返回值为字符串。
类中一组用于比较对象大小的内置方法
内置方法 | 功能描述 |
__gt__(self,one) | 进行self>one运算 |
__lt__(self,one) | 进行self<one运算 |
__ge__(self,one) | 进行self>=one运算 |
__le__(self,one) | 进行self<=one运算 |
__eq__(self,one) | 进行self==one运算 |
__ne__(self,one) | 进行self!=one运算 |
返回值为True或者False
4.私有属性
Python规定,如果一个类的属性名是以__开头,则为私有属性。私有属性在类外无法直接访问。
plus:Python和C++不同,实际上不存在无法访问的私有属性,若想在类外访问,可在该私有属性前加上“_类名”。
5.构造方法与析构方法
↑也是内置方法
构造方法:名为__init__
def__init__(self):
self.属性名='xxx'
析构方法:名为__del__,在对象销毁时自动执行,负责完成待销毁对象的资源清理工作,如关闭文件等。
Plus:对象销毁有三种情况
1)局部变量的作用域结束
2)使用del删除对象
3)程序结束
def__del__(self):
...
6.继承与子类
class son(father1,father2,father3......):
语句1
语句2
语句n
#多个父类则为多重继承
7.方法重写与鸭子类型
方法重写:子类可以对从父类继承过来的方法进行重新定义,从而使得子类对象可以表现出与父类对象不同的行为。(注意要区别与c++的函数覆盖[虚函数virtual],Python中的方法重在体现多态)
class Person:
def Printthing(self):
...
class Student(Person):
def Printthing(self):
...
if__name__=='__main__':
p=Person()
s=Student()
Printthing(p)
Printthing(s) #二者调用的是不同的方法
鸭子类型:关注的并不是对象所属的类,而是一个对象能如何使用。在Python中编写一个函数,传递实参前其参数并不确定,在函数中使用形参进行操作时只要传入对象能够支持该操作程序就能正常执行。(Python中的多态就是借助鸭子类型实现)
8.super方法
作用:获取父类的代理对象,以执行已在子类中被重写的父类方法。
super([父类名,[对象名或类名]])
参数1:要获取的父类代理对象名
参数2:若传入的为对象名,则该对象所属的类必须是第一个参数指定的类或子类;若传入类名,则该类必须是第一个参数指定的类的子类。
class Person:
...
class Student(Person):
def__init__(self,id,name):
super().__init__(name) #调用父类的构造方法
self.id='123'
#super().__init__(name)等价于super(Student,self).__init__(name),首先找到Student的父类,然后把Student转化为Person。
9.内置函数:isinstance,issubclass,type
isinstance | 判断是否为指定类或指定类的子类 |
issubclass | 判断是否为指定类的子类 |
type | 获取一个对象所属的类 |
返回值为True或者False
10.类方法和静态方法
类方法:用@classmethod 修饰,第一个参数为类本身(不是类的实例对象)。
静态方法:用@staticmethod修饰,没有类方法中的第一个参数。
11.动态扩展类和__slots__变量
在给对象绑定方法时,需要使用types模块中的MethodType方法,第一个参数为绑定的函数名,第二个为绑定的对象名。
from types import MethodType
class Person:
...
class Student(Person):
...
def Setname(self,name):
...
if__name__=='__main__':
stu1=Student()
stu1.Setname=MethodType(Setname,stu1) #为对象绑上方法
student.Setname=Setname #为类绑上方法
plus:在给对象绑定方法时,只能通过该对象调用方法,为绑定的其他对象无法调用。
__slots__:限制可动态扩展的属性。若子类中没有__slots__定义,则子类的实例对象可以进行任意属性的动态扩展;若有,则子类中可动态扩展的属性包括子类和父类中通过__slots__定义的属性。
12.@property装饰器
类的属性可以直接访问和赋值,由此可能会给一个属性赋上超出有效范围的值,@property可以将类中属性的访问和赋值操作自动转化为方法调用。
1)直接使用@property可以定义一个用于获得属性值的方法。
2)@属性名.setter可以定义一个设置属性值的方法。
3)注意返回值要在属性名前加'_',或者系统会因不断递归调用而报错。
@property
def score(self):
return self._score
@score.setter
def setscore(self,score):
if score<0 of score>100:
print('error')
else:
self._score=score
13.一些Python的补充
下划线:
一个下划线
1)_ 是有值的,这是因为在 Python 解释器里面, _ 会指向你最后一次执行的表达式。这在我们使用 Python 交互的时候常常会用到。
2)还可以使用单个下划线来格式化变量的值。
两个下划线__xx__
1)以两个下划线开头和结尾的命名方式,最常出现在类的初始化方法,常常是内置函数,所以我们在自己定义新的函数时要注意避开两个下划线。
单个下划线开头的 _xx
以单个下划线开头命名的方法或者变量,就是说明它是仅提供内部使用的。即引用模块时若调用以_开头的函数会无法使用。
此处只记录几个我觉得比较有用的例子,以上参考:Python 各种下划线都是啥意思_、_xx、xx_、__xx、__xx__、_classname_ - 知乎 (zhihu.com)