一、概念
类(Class): 用来描述具有相同的属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法。对象是类的实例。
类变量:类变量在整个实例化的对象中是公用的。类变量定义在类中且在函数体之外。类变量通常不作为实例变量使用。
数据成员:类变量或者实例变量用于处理类及其实例对象的相关的数据。
方法重写:如果从父类继承的方法不能满足子类的需求,可以对其进行改写,这个过程叫方法的覆盖(override),也称为方法的重写。
实例变量:定义在方法中的变量,只作用于当前实例的类。
继承:即一个派生类(derived class)继承基类(base class)的字段和方法。继承也允许把一个派生类的对象作为一个基类对象对待。例如,有这样一个设计:一个 Dog 类型的对象派生自 Animal 类,这是模拟"是一个(is-a)"关系(例图,Dog 是一个 Animal)。
实例化:创建一个类的实例,类的具体对象。
方法:类中定义的函数。
对象:通过类定义的数据结构实例。对象包括两个数据成员(类变量和实例变量)和方法。
二、创建类和实例对象
# -*- coding: utf-8 -*-
"""
Created on Sat Mar 24 11:15:58 2018
@author: smile__su
"""
'''
class Employee: #创建类
empCount=0
def __init__(self,name,salary):
self.name=name
self.salary=salary
Employee.empCount+=1
def displayCount(self):
print('Total Employee:',Employee.empCount)
def displayEmployee(self):
print('Name:',self.name,'Salary:',self.salary)
emp1=Employee('Zara','2000') #创建第一个实例对象
emp2=Employee('Zaras','3000') #创建第二个实例对象
emp3=Employee('Zaras','3000') #创建第三个实例对象
emp4=Employee('Zarad','4000') #创建第四个实例对象
emp4.displayEmployee() #使用.访问对象属性
Employee.displayCount(emp4)
print(emp1.name,emp1.salary)
print(Employee.empCount)
getattr(emp3,'name') # 返回 'age' 属性的值
hasattr(emp1,'age') # 如果存在 'age' 属性返回 True
setattr(emp1,'age',5) # 添加属性 'age' 值为 5
delattr(emp1,'age') # 删除属性 'age'
运行结果:
__dict__ : 类的属性(包含一个字典,由类的数据属性组成)
__doc__ :类的文档字符串
__name__: 类名
__module__ : 类定义所在的模块(类的全名是'__main__.className',如果类位于一个导入模块 mymod 中,那么 className.__module__ 等于 mymod)
__bases__: :类的所有父类构成元素(包含了一个由所有父类组成的元组)
四、python对象销毁(垃圾回收)
class Point:
def __init__(self,x=0,y=0):
self.x=x
self.y=y
def __del__(self):
class_name=self.__class__.__name__
print('实例{}被销毁,所属类是{}'.format(self,class_name))
pt1=Point()
pt3=pt2=pt1
print(id(pt1),id(pt2),id(pt3))
del pt1
del pt2
del pt3
运行结果:
五、类的继承
# -*- coding: utf-8 -*-
"""
Created on Sat Mar 24 14:38:49 2018
@author: smlie__su
"""
'''
class Parent: #定义父类
parentAttr=100
def __init__(self):
print("调用父类构造函数")
def parentMethod(self):
print("调用父类方法")
def setAttr(self,attr):
Parent.parentAttr=attr
def getAttr(self):
print('父类属性:',Parent.parentAttr)
class Child(Parent):
def __init__(self):
print('调用子类构造方法')
def childMethod(self):
print("调用子类方法 child method ")
c=Child() #实例化子类
c.childMethod() #调用子类方法
c.parentMethod() #调用父类方法
c.setAttr(200) #再次调用父类方法
c.getAttr() #再次调用父类方法
print(issubclass(Child,Parent)) #布尔函数判断一个类是另一个类的
print(isinstance(c,Parent)) #布尔函数如果c是Parent类的实例对象或者是一个Parent子类的实例对象则返回 true
运行结果:
六、方法重写
###方法重写
class Parent:
def myMethod(self):
print('调用父类方法')
class Child(Parent):
def myMethod(self):
print("调用子类方法")
c=Child() #子类实例
c.myMethod() #子类调用重写
运行结果:
基础方法重写:
类的私有属性__private_attrs:两个下划线开头,声明该属性为私有,不能在类的外部被使用或直接访问。在类内部的方法中使用时 self.__private_attrs。
类的方法在类地内部,使用 def 关键字可以为类定义一个方法,与一般函数定义不同,类方法必须包含参数 self,且为第一个参数。
类的私有方法__private_method:两个下划线开头,声明该方法为私有方法,不能在类地外部调用。在类的内部调用self.private_metho。
八、单下划线、双下划线、头尾上下划线说明__foo__: 定义的是内置方法,类似 __init__() 之类的。
_foo: 以单下划线开头的表示的是 protected 类型的变量即保护类型只能允许其本身与子类进行访问,不能用于 from module import *
__foo: 双下划线的表示的是私有类型(private)的变量, 只能是允许这个类本身进行访问了。