@面向对象
开启博客之路,开始做笔记ing
一,类的创建
1,类的定义
class People:
country = 'China' #类变量
def __init__(self,name,sex,age,height ):#构造函数
self.name = name #实例变量(从C++角度,类似于数据成员)
self.sex = sex
self.age = age
self.__height = height #私有属性
def printInfo(self): #方法(从C++角度,类似于成员函数)
print("%s is a %s,from %s"%(self.name,self.sex,self.country))
def __myPrivacy(self):#私有方法
print("This is my privacy!")
2,self
参数self,指向对象本身,代表类的实例,必不可少,可以随便给这个参数命名,一般习惯上为self.
3,类变量
类变量为所有实例所共享,直接访问可用 类名.类变量。
实例变量,为此实例独享。
类变量的访问
访问类变量时首先访问实例变量,若实例变量不存在时则访问类变量,若实例变量存在,则以下方法一和方法二访问到的变量均为实例变量。
方法一:类变量在类内的访问方式为 self.country;
方法二:在类外访问方式为p1.country;
方法三:直接访问方式为People.country.
#若country的实例变量不存在
p1 = People("Zhangsan","girl",22,160)
p1.printInfo()
print("from:",p1.country)
print("country:",People.country)
Zhangsan is a girl,from China
from: China
country: China
#若实例变量存在
class People:
country = 'China' #类变量
def __init__(self,name,sex,age):#构造函数
self.name = name #实例变量
self.sex = sex
self.age = age
self.country = 'Ch'
def printInfo(self): #方法
print('%s is a %s,from %s'%(self.name,self.sex,self.country))
p1 = People("Zhangsan","girl",22)
p1.printInfo()
print("from:",p1.country)
print("country:",People.country)
Zhangsan is a girl,from Ch
from: Ch
country: China
类变量的修改
修改类变量时,可用People.country直接赋值,实例修改类变量时,p1.country = ‘A’,表示在本实例空间内添加实例变量,不会修改类变量的值。若实例要修改类变量可用p1.__class__.country = ‘A’。
二,类的继承
class A0:
def __init__(self):
print("init A0")
def printName(self):
print("class name:A0")
class A1:
def __init__(self):
print("init A1")
def printName(self):
print("class name:A1")
class B(A0): #单继承
def __init__(self):
super().__init__()
print("init B")
#def printName(self):
#print("class name:B")
class C(A0,A1): #多重继承
def __init__(self):
A0.__init__(self)
A1.__init__(self)
print("init C")
def printName(self):
print("class name:C")
多重继承
1,构造函数__init__()
构造函数用于实例初始化,在继承中,子类的构造函数必须调用其父类的构造函数,以确保基本的初始化。有两种方法:
1.单继承中可以如下调用,以下以class B中的构造函数为例。
super().__init__() (旧类中 super(B,self).__init__())
A0.__init__(self) (调用未关联的超类构造函数)
2.多继承中如下调用,以class C为例。
super(C,self).__init__()
super(A0,self).__init__()
A0.__init__(self)
A1.__init__(self)
如有需要初始化父类的参数,均在调用的父类的init中。
执行
c = C()
结果
init A0
init A1
init C
2,方法调用
如果多个父类以不同的方式实现了同一个方法,并且子类未实现此方法且未指定父类的方法,则从左到右查找父类中是否包含方法,位于前面的类的方法则覆盖位于后面的类的方法。
#运行
c = C()
c.printName()
b = B()
b.printName()
#结果
init A0
init A1
init C
class name:C
init A0
init B
class name:A0
3,一些其他的方法
1,要确定一个类是否为另一个类的子类,可使用内置方法issubclass.
issubclass(childrenClass,basesClass),返回True或者False。
2,访问一个类的基类,可访问其特殊属性__bases__。
childrenClass.__bases__
3,要确定对象是否为特定类的实例,可使用isinstance。
p = People()
isinstance(p,People)
返回True或者False
查看数据类型也可以用isinstance(a,int)。
4,获取对象属于哪个类,可用属性__class__.
p.__class__。