类的概念

class Student:
    stuCount = 0  # 类变量
    __single_field = '这是私有成员,以__开头'
 
	def __init__(self, inName, inAge):  # 构造方法
		self.name = inName  # 这里的成员变量一定加 self
		self.age = inAge
		self.sex = '男'
		Student.stuCount += 1
 
	def say_hi(self):  # 成员方法
		print(f"大家好,我是{self.name}")
 
	def say_hi2(self, mess):  # 成员方法
		print(f"大家好,{mess}")
 
	def __single_func():
		print('这是私有方法,以__开头')
		print(f'这是私有成员,{self.__single_field}')
 
stu = Student('wsc', 18)
stu.say_hi()
stu.say_hi2('你们开心嘛')

魔术方法

  • __init__:构造方法
  • __str__:字符串方法
  • __lt__:小于、大于比较
  • __le__:小于等于、大于等于比较
  • __eq__:==符合比较

内置类属性

  • __dict__ : 类的属性(包含一个字典,由类的数据属性组成)
  • __doc__ :类的文档字符串
  • __name__: 类名
  • __module__: 类定义所在的模块(类的全名是’main.className’,如果类位于一个导入模块 mymod 中,那么 className.module 等于 mymod)
  • __bases__ : 类的所有父类构成元素(包含了一个由所有父类组成的元组)
class Employee:
   '所有员工的基类'
   empCount = 0
 
print "Employee.__doc__:", Employee.__doc__
print "Employee.__name__:", Employee.__name__
print "Employee.__module__:", Employee.__module__
print "Employee.__bases__:", Employee.__bases__
print "Employee.__dict__:", Employee.__dict__

继承

class 派生类名(基类名)
    ...
class 派生类名( 1 2 3...)
    ...

在 python 中继承中的一些特点:

  • 1、如果在子类中需要父类的构造方法就需要显式的调用父类的构造方法,或者不重写父类的构造方法。详细说明可查看: python 子类继承父类构造函数说明
  • 2、在调用基类的方法时,需要加上基类的类名前缀,且需要带上 self 参数变量。区别在于类中调用普通函数时并不需要带上 self 参数
  • 3、Python 总是首先查找对应类型的方法,如果它不能在派生类中找到对应的方法,它才开始到基类中逐个查找。(先在本类中查找调用的方法,找不到才去基类中找)。
  • 如果在继承元组中列了一个以上的类,那么它就被称作”多重继承” 。

你可以使用 issubclass() 或者 isinstance() 方法来检测。

  • issubclass() - 布尔函数判断一个类是另一个类的子类或者子孙类,语法:issubclass(sub,sup)
  • isinstance(obj, Class) 布尔函数如果 obj 是 Class 类的实例对象或者是一个 Class 子类的实例对象则返回 true。

多继承:

  • 多个父类中,如果有同名的成员,那么默认以继承顺序(从左到右)为优先级。
  • 即:先继承的保留,后继承的被覆盖

调用父类同名成员

  • 一旦复写父类成员,那么类对象调用成员的时候,就会调用复写后的新成员
  • 如果需要使用被复写的父类的成员,需要特殊的调用方式:
    • 方式 1:调用父类成员
      使用成员变量:父类名.成员变量
      使用成员方法:父类名.成员方法(self)
    • 方式 2:使用 super()调用父类成员
      使用成员变量:super().成员变量
      使用成员方法:super().成员方法()

多态

class Animal:
	def speak(self):
		pass
 
class Dog(Animal): # 重写 speak
 
class Cat(Animal): # 重写 speak
 
def make_noice(animal: Animal):
	animal.speak()

运算符重载

class Vector:
   def __init__(self, a, b):
      self.a = a
      self.b = b
 
   def __str__(self):
      return 'Vector (%d, %d)' % (self.a, self.b)
 
   def __add__(self,other):
      return Vector(self.a + other.a, self.b + other.b)
 
v1 = Vector(2,10)
v2 = Vector(5,-2)
print v1 + v2

单下划线、双下划线、头尾双下划线说明:

  • __foo__: 定义的是特殊方法,一般是系统定义名字,类似 __init__()  之类的。
  • _foo: 以单下划线开头的表示的是 protected 类型的变量,即保护类型只能允许其本身与子类进行访问,不能用于  from module import *
  • __foo: 双下划线的表示的是私有类型(private)的变量, 只能是允许这个类本身进行访问了。