类的简介
我们目前所学的一些对象例如(int 、str、 list、tuple、dict…)这些都是Python的内置对象
类,简单的理解就是相当于一个图纸。在程序中我们根据类来创建对象
类就是对象的图纸,我们称之为对象的实例(instance)
如果多个对象是通过一个类来创建的,我们称之为这些对象都是一类对象
如:int() float() bool() list() …这些都是类
a = 10
a = int(10 ) #创建了一个int类型的实类
这些都是Python内置的
创建自定义的类
Python定义一个类使用关键字class来声明,类的声明格式如下:
class className:
类体
其中,class是关键字,class Name(类名)为有效的标识符,命名规则一般为多个单词组成的名称,除每个单词的首字母大写外。注意类名后面有个冒号。在类体中,可以定义属性和方法,由缩进的语句块组成。
创建对象
类是抽象的,必须实例类才能使用类定义的功能,即创建类的对象。如果把类的定义视为数据结构的类型定义,那么实例化就是创建了一个这种类型的变量。
class Myclass:
pass
print(Myclass) #<class '__main__.Myclass'>
#使用Myclass创建一个对象
#使用类来创建对象,就像调用函数一样
mc = Myclass()#mc就是通过Myclass创建的对象,mc是Myclass的实例
#isinstance()用来检查一个对象是否是一个类的实例
result = isinstance(mc,Myclass)
print(result)
print(mc,type(mc))
运行结果:
<class '__main__.Myclass'>
True
<__main__.Myclass object at 0x0000020248E98278> <class '__main__.Myclass'>
类的type类型的对象
class Myclass:
pass
#类是type类型的对象,定义类实际上就是定义了一个type类型的对象
print(Myclass,type(Myclass)) #<class '__main__.Myclass'> <class 'type'>
#创建了一个变量a,相当于就是在内存当中新开辟了新的对象,但这个对象指向的是Myclass这个类
a= Myclass()
print(a,type(a)) #<__main__.Myclass object at 0x0000011284248208> <class '__main__.Myclass'>
使用类创建的一个流程
1、创建一个类
2、创建对象
class Myclass:
name = '葫芦娃'
#类名.类变量名 读取类属性的值
print(Myclass.name) #葫芦娃
#类名.类的变量名=值 修改类属性的值
Myclass.name = '钢铁侠'
print(Myclass.name)
#初始化类的属性
print(Myclass) #<class '__main__.Myclass'>
#创建Myclass一个实例,在内存区域中开辟出新的内存地址给mc_2,mc_2指向的是Myclass这个类
mc_2=Myclass
mc_2.name = 'hlw'
print(mc_2.name)
运行结果:
葫芦娃
钢铁侠
<class '__main__.Myclass'>
hlw
类的定义
类的定义:类和对象都是现实生活中内容的抽象
#实际上所有的事物是由两部分组织
#1.数据属性(属性)
#2.行为(方法)
#在类的代码块中我们可以定义变量和函数
#在类中我们所定义的变量将会成为所有实例的公共属性
#所有实例都可以访问这些变量
#创建一个类
class Person():
#在类的代码块中我们可以定义变量和函数
#在类中我们所定义的变量将会成为所有实例的公共属性
#所有实例都可以访问这些变量
name = '葫芦娃'
age = 18
#创建类的实例
p1 = Person()
p2 = Person()
#通过类名.类变量名 来读取类属性的值
print(p1.name,p2.age)
运行结果:
葫芦娃 18
当类中有函数时,调用方法
class Person():
#在类中也可以定义函数,类中定义的函数我们称之为方法
#这些方法也可以通过该类的实例来访问
def say_hello(a): #类调用时,必须要传递一个形参
print('你好')
p1 = Person()
p2 = Person()
#调用语法:对象.方法名
#方法调用和函数调用的区别
#如果是函数调用,函数有几个形参,则调用函数的时候就要传递几个实参
#但是如果是方法调用,默认要传递一个参数,所以方法中要定义一个形参
#注意:方法调用时,第一个参数有解释器自动传递,所以定义方法时,至少要定义一个形参
p1.say_hello() #类名.类的变量名 读取类属性的值
属性和方法
属性的查找流程:当我们调用一个对象时,解析器会先在当前对象中寻找是否含有该属性,
如果有,则直接返回当前对象的属性值。
如果没有则去当前对象类对象中寻找,如果有则返回类对象的属性值,如果没有则报错
类对象和实例对象都可以保存 属性(方法)
如果这个属性(方法)是所有实例共享的,则应该将其保存到类对象中
如果中国属性(方法)是某个实例独有的,则应该保存到实例中
class Person():
name ='葫芦娃'
def say_hello(a):
#方法每次调用的时候,第一个参数就是调用方法的本身,如果是p1调用则第一个参数介绍p1对象
#如果是p2调用,则第一个参数就是p2对象
#一般我们都会命名为self
print(a)
p1 = Person()
p1.say_hello()
print(p1)
p2=Person()
p2.say_hello()
print(p2)
运行结果:
<__main__.Person object at 0x04E9AE50>
<__main__.Person object at 0x04E9AE50>
<__main__.Person object at 0x04E9FE70>
<__main__.Person object at 0x04E9FE70>
class Person():
name ='葫芦娃'
def say_hello(self):
#方法每次调用的时候,第一个参数就是调用方法的本身,如果是p1调用则第一个参数介绍p1对象
#如果是p2调用,则第一个参数就是p2对象
#一般我们都会命名为self
print('你好我是:%s'%self.name)
p1 = Person()
p1.name='钢铁侠'
p1.say_hello()
p2=Person()
p2.name = '葫芦娃'
p2.say_hello()
运行结果:
你好我是:钢铁侠
你好我是:葫芦娃
#当p1中我们没有调用类变量名时,将去clss Person()这个类属性中,寻找。
class Person():
name ='葫芦娃'
def say_hello(self):
#方法每次调用的时候,第一个参数就是调用方法的本身,如果是p1调用则第一个参数介绍p1对象
#如果是p2调用,则第一个参数就是p2对象
#一般我们都会命名为self
print('你好我是:%s'%self.name)
p1 = Person() #当p1中我们没有调用类变量名时,将去clss Person()这个类属性中,寻找。
p1.say_hello()
p2=Person()
p2.name = '葫芦娃'
p2.say_hello()
运行结果:
你好我是:葫芦娃
你好我是:葫芦娃