学Python划重点 三 (类的知识点总结)

面向对象思想有三个基本特征:封装、继承和多态

一、创建和使用类

实例:

# 类的定义
class Dog():
	def __init__(self, name, age):
		self.name = name
		self.age = age
	def sit(self):
		print(self.name + " is now sitting.")
	def roll_over(self):
		print(self.name + " rolled over!")
# 类使用
dog = Dog("xiao","1")
dog.sit()

知识点:

1. 初始化方法 _init _()

形参 self 必不可少,还必须位于其他形参的前面,每个与类相关联的方法调用都自动传递实参 self ,它是一个指向实例本身的引用,让实例能够访问类中的属性和方法。self 会自动传递,因此我们不需要传递它。

2. 析构方法是__del__()

3. 定义枚举类

class  枚举类名(enum.Enum):
	枚举常量列表

在这里插入图片描述


二、类成员的介绍

1. 类变量

属于类本身的变量,即类变量。类变量属于整个类,不是特定实例的一部分,而是所有实例之间共享一个副本,类变量要在方法之外定义。

class Dog():
    count=0 # 类变量
    def __init__(self, name, age):
	    self.name = name #实例变量
	    self.age = age #实例变量
# 类使用
dog = Dog("xiao","1")
Dog.count += 1 # 类变量的访问与操作
dog.name # 实例变量的访问

# 注意:如果通过实例变量对类变量赋值操作,这样会为实例创建一个同名的变量,从而覆盖类变量
# 通过实例访问 类变量或者类方法时,其原理都是先访问实例中是否存在该值,如果不存在才会访问类变量和类方法
dog.count =1

当通过实例读取变量时,Python 解释器会先在实例中找这个变量,如果没有找到再到类中去找;当通过实例为变量赋值时,无论类中是否有该同名类变量,Python 解释器都会创建一个同名实例变量。

2. 类方法

通过@classmethod来声明类方法。
“类方法”与“类变量”类似,属于类不属于个体实例的方法,类方法不需要与实例绑定,但需要与类绑定,定义时它的第一个参数不是self ,而是类的type 实例

#  类方法
class Dog():
	count=0 # 类变量
	@classmethod 
	def getName(cls, name): #类方法
		return name+"是第"+str(cls.count)+"只狗"

3. 静态方法

class Dog():
	count=0 # 类变量
	@staticmethod
	def getName(name): #静态方法
		return name+"是第"+str(Dog.count)+"只狗"

4. 访问权限

_xxx :受保护成员;
__xxx :私有成员;
__xxx__ :系统定义的特殊成;

注意:Python 没有严格的私有成员,所谓的私有python只是将__ 变量修改为_ 类名__ 变量 ,所以还是可以通过“ 对象._ 类名__ 变量”进行访问。

5. 定义属性

@ property用来修饰getter 访问器,@ 属性名.setter用来修饰setter 访问器。
这个定义属性和C#里面差不多。

class Dog():
	def __init__(self, name, year=1):
		self.name= nam
		self.__year = year
		
	# 定义属性
	@property
	def year(self):
		return self.__year
	@weight.setter
	def year(self, year):
		self.__year = year

# 访问属性
dog=Dog("xiao",1)
dog.year # 注意访问的方式,不是以前那种通过get set 方法来访问属性了

三、类的继承

大多数的编程语言是不支持多继承的,因为多继承会发生类成员名出现冲突。
Python 是支持多继承的 ,
Python 解决名称冲突的方法是:
这个 方案是,当子类实例调用一个方法时,先在子类中查找,如果没有找到则查找父类。 父类的查找顺序是按照子类声明的父类列表从左到右 查找,如果没有找到再找父类的父类,依次查找下去。

class ElectricCar(Car):
	def __init__(self, year):
		super().__init__(make, model, year)# 继承时需要对父类进行初始化

1. 对父类进行初始化最好使用:super().__init__方式。
2.多继承时,使用super() 方法,由于python 中super() 算法的原因,必须把全部的参数传递给父类,否则会报错 。
3.单继承时,使用super 方法() ,参数不能全部传递,只能传父类方法所需的参数,否则会报错。

类型检查函数:

isinstance(object,classsinfo) 函数,它可以检查object 实例是否由classinfo 类或classinfo 子类所创建的实例。
issubclass (class, classsinfo) 函数,它用来检查class 是否是classinfo 的子类。


四、类的魔法方法

所谓的魔法方法就是带双下划线开头的方法。

  1. __str__():返回该对象的字符串表示;
  2. __eq__():指示其他某个对象是否与此对象“相等”,"=="时调用;
  3. __init__():初始化方法;
  4. __del__():析构方法;
  5. __new__():构造方法;
  6. __getattribute__(self,name):定义当该类的属性被访问时的行为;
  7. __setattr__(self,name,value):定义当一个属性被设置时的行为;
  8. __delattr__(self,name):定义当一个属性被删除时的行为;
  9. __hasattr__(object,name):检查对象是否有此属性;
  10. __getattr__(object,name[,default]):获得属性值,如果不存在则返回默认值default ;
  11. property(fget,fset,fdel):设置一个属性,三个参数为函数;

五、模块的导入

import car
import time as t
from  module_name import *
from  module_name import Car
from  module_name import Car as C

当模块作为主程序运行时,__name__==__main__


今天睡了一下午,还是舒服的!!!

发布了60 篇原创文章 · 获赞 67 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_45021180/article/details/105475930