python3学习之面向对象

@面向对象
开启博客之路,开始做笔记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。

扫描二维码关注公众号,回复: 11821593 查看本文章
p = People()
isinstance(p,People)
返回True或者False

查看数据类型也可以用isinstance(a,int)。
4,获取对象属于哪个类,可用属性__class__.

p.__class__。

猜你喜欢

转载自blog.csdn.net/Lhhxxdhr/article/details/106551065