类的相关概念:
1.类的定义
2.成员的概念
1)成员的分类
2)成员的引用
3.类的三大特征:
1)封装性
2)继承性
3)多态性
4.类的一些特殊函数
1.类的定义:
1)python语言描述:
#类的定义
class 类名():
成员1
成员2
成员3
....
#例子
class Person():
num = 0 #成员1
def Sayhello(self): #成员2
print("hello!!!!")
注意事项:
1.定义的时候类名开头一般要大写(后面杂说会有讲解)
2.注意缩进符
3.注意在定义的时候
2.成员的概念:
1)成员的分类:
按照属性和方法分类:
成员分为俩大类:属性和方法
相关python语言的描述:
class Person(): #定义了Person这个类
num = 0 #num就是类的属性
def Sayhello(self): #sayhello就是类的方法
print("你好!!")
def learn(self): #learn(类的方法)表明人这个类会学习
print("我会学习")
注意事项和补充说明:
- 在定义类的方法的时候注意必须含有一个参数self
- 类与成员(属性和方法)的关系好比是:
类如果是一个人,那么你得首先知道这个人具有什么特征(就是属性)
同时你得知道人具有什么行为(方法)比如说:人可以学习,人会吃饭…
2)成员的引用:
1.说明:
- 引用分为属性引用和成员引用
- 并且和成员的引用紧密结合的是成员的实例化((这里仍然借用上面人的例子)实例化就相当于是把这个人这一大类具体化到一个真真实实的人身上,比如:把人具体实例化到小明这个真真实实人身上)
2.相关python语言的描述:
#类的定义
class Person():
num = 0 #定义了一个类属性
def sayhello(self):#定义了方法
print("你好!!")
def learn(self,name):
self.name = name
print("I am learning")
print("my name is %s"%(self.name))
#类的实例化
xiaoming = Person() #实例化到了xiaoming身上相当于是xiaoming具有了Person这个类的所有的属性和方法
xiaoming.sayhello() #引用方法(这里的方法是实例方法)
xiaoming.learn("xiaoming") #引用方法(这里的方法是实例方法)
print(Person.num) #引用类属性(注意是类属性不是实例属性)
print(xiaoming.name) #引用实例属性
执行结果:
注意事项:
- 实例.方法名() 在调用这个的时候不用进行self的传值
- self的详细介绍看这位博主的介绍:
https://blog.csdn.net/qq_27825451/article/details/ - 属性的调用:
实例.属性名(这是在函数外部调用类的实例属性)
self.属性名(这是在函数内部调用类的实例属性) - 方法的调用:
实例.方法名()(这里的方法是实例方法)
类名.方法名(self,其他参数)(这里的方法是实例方法)
#以上俩个是在函数外部调用方法的语法
self. 方法名(其他参数)
#这是在类内部调用实例方法 - 成员的分类:
- 属性的分类按照在类中的位置不同分为:
1)类属性(在类中,实例方法外)
2)实例属性(以self.属性名这种格式的都是实例属性)
3)局部属性(局部变量)在函数内而且没有self前缀 - 方法分为类方法(方法上面有@classmethod有这个标识即为类方法),实例方法(类中既没有类方法的标识,也没有静态方法的标识),静态方法(和类方法类似 @staticmethod )
#相关参考资料:
http://c.biancheng.net/view/4552.html
3.类的三大特性:
1)类的封装性:
由于是类是一个面向对象的概念,所以当你在调用类属性和方法的时候根本不需要知道这些内部的细节是什么,只需要知道这些属性和方法是用来实现什么就可以了(就好比一个电视机你根本无需知道电视机的内部是什么,你只需要要知道如何看如何用就ok了)
2)类的继承性:
- 继承性从字面意思理解就是从一个人那继承所有的东西包括他的功能和一些特征(好比继承财产),但是继承的时候私有的是不能继承的(好比你可以从一个人那里继承财产但是你不可能继承他的身体)
- 类的继承:有同样的道理;子类继承父类,子类具有了父类的所以的属性和方法(一定一定要注意:这里属性和方法都是共有的不是私有的)
- 成员重载(成员重写):就是父类的成员无法满足子类的成员的时候就得成员重载(成员重写)
- 继承还具有多样性(子类不仅仅从一个父类那里继承)
- 相关python语言的描述:
#定义父类
class Person(object): #如果不写object则在子类中无法使用super函数
#析构函数(作用是初始化如果自行不定义,那么系统会自动调用内部的析构函数)
def __init__(self,name,age,sex):
self.serName(name)
self.setAge(age)
self.setSex(sex)
def sayhello(self):
print("你好!!!")
def setName(self,name):
if type(name) != str:
print("姓名输入错误,必须是字符串")
return print("姓名是:%S"%(name))
def setAge(self,age): #此处的age是形参
if type(age) != int:
print("年龄输入错误,必须是整数")
return print("年龄:%d"%(age))
def setSex(self,sex):
if sex != '男' and sex != '女':
print("性别输入错误")
return print("性别:%s"%(sex))
#实例化并且用父类
print("这是为父类这个数据类型的结果")
xiaoming = Person("小明",18,'男')
print("\n")
#定义子类
class Students(Person):
def __init__(self,name,age,sex,schoolyear):
super(Students,self).__init__(name,age,sex)#super(Students.self)相当于是自动绑定了实例,这是子类调用父类中的方法第一种(注意是子类中调用父类不是实例化调用)
#当然也可以用父类这中方法调用父类的方法Person.__init__(self,name,age,sex,schoolyear)这种方法self不会自动绑定,这是子类调用父类中的方法第二种
def schoolyear(self,schoolyear):
#此处的schoolyear是形参
if type(schoolyear) == int:
return print("学生的入学年份为:",schoolyear)
print("这是子类这个数据类型的结果:")
xiaohong = Students("小红",18,"女",2020)
注意事项:
1)init函数是系统内部函数可以进行自我定义但需注意是第一个参数必须是self(实例)
其功能是初始化
同时这个函数是隐式调用,不是显示调用
参考资料:http://c.biancheng.net/view/4533.html
2)super函数:
其该函数就是为了在派生类(子类)中调用基类(父类)中的方法。
其格式为:super(子类类名,self).父类方法名
3)继承的三大特性:
- init析构函数不会自动调用父类里面的析构函数
(个人的理解是由于是特殊成员可以当做为私有成员,而继承的特性是只能继承全部的基类的公有成员,所以不会自动调用) - 派生类中调用父类的方法的格式:基类名.方法名(self,其他参数)或者使用super函数
- python总是先查找对应类型的方法,如果查不到在从父类那里查