数据封装、继承和多态是面向对象的三大特点
比如:将大象装进冰箱需要几步:
第一步:打开冰箱
第二步:将大象装进去
第三步:关上冰箱
python中有很多自己的内置对象,比如int(),str(),float()…
a = 10 == a = int(10) == 创建了一个int类的实例
a = 'hello world' == a =str('hello world') == 创建了一个str类的实例
但是仅仅靠内置对象不足以满足我们的需求,所以需要我们自己定义对象
定义一个类,其实可以算是定义了一个type类型的对象,也就是说,创建了一个对象,而对象的类型type是class(类)
语法:
class 类名(父类):
#类的属性
name = '程序猿'
#类的方法
def joke(self):
print('创建类成功')
class Myclass():
pass
print(Myclass,type(Myclass))
<class '__main__.Myclass'> <class 'type'>
class Myclass(object):
pass
定义好了Myclass类,就可以根据Myclass类创建出Myclass的实例,创建实例是通过类名+()实现的
class Myclass():
pass
mc = Myclass()
mc.name = '秃头程序猿'
print(mc,type(mc))
print(mc.name)
<__main__.myclass object at 0x7f4afb5248b0> <class '__main__.myclass'>
秃头程序猿
isinstace用来检查一个对象是否是一个类的实例,返回值是布尔类型
class Myclass():
#类的属性
name = '程序员'
#类的方法
def world(a):
print('调用方法成功')
mc = Myclass()
mc2 = Myclass()
mc3 = Myclass()
print(isinstance(mc,Myclass))
print(isinstance(mc,int))
True
False
像以下实例,类中的方法中没有设立形参。将类实例化之后调用方法则会报错
class Myclass():
#类的属性
name = '程序员'
#类的方法
def world():
print('调用方法成功')
mc = Myclass()
mc.world()
TypeError: world() takes 0 positional arguments but 1 was given
而在类的方法中随便设立一个形参之后,则调用成功
class Myclass():
name = '程序猿'
def world(a):
print('调用方法成功')
mc = Myclass()
mc.world()
调用方法成功
class Myclass():
#类的属性
name = '程序员'
#类的方法
def world(a):
print('调用方法成功')
mc = Myclass()
mc2 = Myclass()
mc3 = Myclass()
mc.world()
mc2.world()
mc3.world()
调用方法成功
调用方法成功
调用方法成功
class Myclass():
#类的属性
name = '程序员'
#类的方法
def world(a):
print('调用方法成功')
mc = Myclass()
mc2 = Myclass()
mc3 = Myclass()
mc.name = '搬砖工'
print(mc.name) #直接返回当前对象返回值
print(mc2.name) #当前对象中的类对象中找
print(mc3.name) #当前对象中的类对象中找
搬砖工
程序员
程序员
没有则报错
class Myclass():
#类的方法
def world(a):
print('调用方法成功')
mc = Myclass()
print(mc.name)
AttributeError: 'Myclass' object has no attribute 'name'
self参数
self在英文中,是’自己’的意思,在python中,self是’实例本身’的意思
class Myclass():
name='程序猿'
def print_name(self):
print('我的职业是'+self.name)
mc1 = Myclass()
mc2 = Myclass()
mc1.name = '搬砖工'
mc1.print_name()
mc2.print_name()
我的职业是搬砖工
我的职业是程序猿