只是做学习记录和笔记整理,如有错误欢迎指正~
一、类的创建和调用
(一)类与对象的定义
- 类
是多个类似事物组成的群体的统称,类之下都包含着无数个不同的个例。在python中就把类的个例叫做实例。它们之间的关系类似群体和个体的关系,每个个体都有着相同的特征和行为。 - 对象
无论是类还是实例,都可以当作是行动或思考的对象。前者是类对象
,后者是实例对象
。
(二)类的创建与调用
1.类的创建:
类名的首字母要大写,格式为:class+类名+冒号:
- 属性
描述事物是怎样的,有什么特征,如黑眼睛、黄皮肤。在类中赋值的变量叫做属性
- 方法
描述事物能做什么,有哪些行为和作用
实例方法是指类中参数带self的函数
class Computer:#类的创建 class+类名+:
screen=True#类的属性创建 通过赋值语句
def start(self):
print('电脑正在开机')
- 与函数定义语句不同的是,实例方法中必须有个放在首位的sefl参数
- 类的调用
调用的方法是实例.属性
和实例.方法
每个实例都可以调用类中的属性和方法
class Computer:#类的创建 class+类名+:
screen=True#类的属性创建 通过赋值语句
def start(self):
print('电脑正在开机')
my_computer=Computer()
print(my_computer.screen)
my_computer.start()
(三)两个关键点
- 特殊参数self
self是所有实例的替身,即需要有一个变量self来代替接收数据。
Class Chinese:
name='小明'
def say(self):
print(self.name+'是中国人')
#本来应该是person.name,但实例peron还没创建,用self参数来代替接收数据
person=Chinese()
person.say()
- 与函数的区别
用类编写不用考虑全局变量和局部变量,在类的方法内部
调用类属性或其他方法
时,就可以采用self.属性名
或self.方法名
的格式。
Class Chinese:
name='小明'
def say(self):
print(name+'是中国人')
#此时会报错,name在say方法中没有被定义。
- 初始化方法
定义初始化方法的格式是def init(self),是由init加左右两边的【双】下划线组成
初始化方法的作用在于:
- 当每个实例对象创建时,该方法内的代码无须调用就会自动运行,不必重复传入参数。
class Chinese:
def __int__(self):
print('很高兴遇见你,我是初始化方法')
person=Chinese()
- 可以接收其他参数,作为属性在类的方法之间流转。
class Chinese:
def __init__(self,birth,name,region):
self.birth=birth
self.name=name
self.region=region
def born(self):
print(self.name+'出生在'+self.birth)
person=Chinese()
person.born()
二、类的定制和继承
(一)类的继承
- isinstance()
用来判断某个实例是否属于某个类,输入两个参数,第一个是实例,第二个是类或类组成的元组,输出是布尔值(True 或 False)
print(isinstance(1,int))
print(isinstance(1,str))
- 多层继承
子类创建的实例可调用所有层级父类的属性和方法。
class People:#父类
pass
class Chinese(People):#子类
pass
xiaoming=Chinese()#子类的实例
kevin=People()#父类的实例
print('\n验证1:子类创建的实例也属于父类)
print(isinstance(xiaoming,People))
print('\n验证1:父类创建的实例不属于子类)
print(isinstance(kevin,Chinese))
如果要为每个省级行政区的人各创建一个类,并添加各种属性和方法。那么,只要创建一个父类Chinese,在父类中将共同的属性和方法写好,然后34个类都可以通过类的继承得到Chinese的属性和方法,代码量可以减少十几甚至几十倍。
2. 多重继承
- 在子类调用属性和方法时,优先考虑靠近子类的父类。
- 若父类还有父类的话,会先继续往上找到顶
class C0:
name='C0'
class C2(C0):
num=2
class C1:
num=1
class C3:
num=1
class C4(C1,C2,C3):
pass
ins=C4()
print(ins.name)#打印出C0
#先找C1,再找C2,再找C2的父类C0
print(ins.num)#打印出1
#先找C1
(二)类的定制
子类可以在继承的基础上进行个性化的定制:
(1)创建新属性、新方法
class Chinese:
eye='black'
def eat(self):
print('我们都是中国人')
class Fujianren(Chinese):#类的继承
native_place='fujian'#类的定制:创建新属性
def dialect(self):#类的定制:创建新的方法
print('我们的方言很不一样')
xiaoming=Fujianren()
print(xiaoming.eye)#父类的属性也能用
(2)修改继承到的属性或方法
class Chinese:
def land_area(self,area):
print('我们居住的地方,陆地面积是%d万平方公里左右。'% area)
class Cantonese(Chinese):
def land_area(self,area,rate=0.0188):#类的定制:修改继承到的方法
Chinese.land_area(self,area*rate)#用父类.方法(self,新的参数)
class Chinese:
def __init__(self, greeting = '你好', place = '中国'):
self.greeting = greeting
self.place = place
def greet(self):
print('%s!欢迎来到%s。' % (self.greeting, self.place))
class Cantonese(Chinese):
def __init__(self, greeting = '雷猴', place = '广东'):
Chinese.__init__(self, greeting, place)#用父类.__init__(self,参数2,参数3)
yewen = Cantonese()
yewen.greet()