类的定义
类格式示例:
class Student():
name = ''
age = 0
def print_file(self):
print('name:' + self.name)
print('age:' + str(self.age))
注:类中的函数,参数列表中必须有self,并且如果想在函数中引用类中变量需要使用self. 操作符。
类实例化示例:
student = Student()
浅谈函数与方法的区别
建议在一个模块里写类,在另外一个模块里将类实例化并且调用里面的函数:
方法和函数的区别:
没有绝对的区别(c\c++里面更多的称为函数,java\c#里面更多的称为方法)
方法是设计层面的称谓,是面向对象的;函数是程序运行、过程式的称谓
类下面的称为方法,因为类是面向对象的;如果只是定义在模块里的,还是称为函数
定义在模块里的,称为变量;出现在类内的,称谓数据成员
类与对象
1)两者是通过实例化关联在一起。如:student = Student()
2)类的理解:它将数据以及这些数据上的操作封装在一起
3)在类中:数据成员(即变量)刻画类的特征;方法(即函数)描述类的行为。就像描述student除了name和age,还有其相应的行为,比如做作业和考试
4)类设计得好不好,就在于能否抓住类的行为和特征,所以把print_file( )这个函数放在student类下是不合适的,所以最好再设置一个类printer
对象:
1)对象表示一个具体的概念。类是一个共同的群体名,而对象是类的具体实例
2)向类传递具体的参数,可以产生不同对象
构造函数
①实例化过程自动调用构造函数,可以在构造函数里初始化对象的特征
构造函数可以让类生成不同的对象,实例化传入不同的参数
python中构造函数的格式:
def __init__(self,name,age):
name=name
age=age
python是知道等号左边的name和等号右边的name是什么意思的,所以不用纠结是否给等号右边的值(形参)起一个新的名字例如name1等
注:python中的构造函数可以显示调用,但很少这样做。如:
student1 = Student(‘石敢当’,18) #构造函数在实例化的时候自动调用
student1.init()
此时用这种显示方式调用构造函数与调用普通函数无异,并且这样调用也只返回None.(跟前面讲的一样,不写return编译器自动认为return None)
区别模块变量与类中变量
模块中局部变量和全局变量的机制与类完全不同
模块变量的机制:局部变量不会覆盖全局变量,局部变量的作用域仅在函数内
c=50
def add(x,y):
c=x+y
print c
add(1,2)
print c
返回值为3
50
而类的机制与“类变量”和“实例变量”相关(下节开始说)
注意:不要把模块和类看起来相似的地方等同起来!
类变量与实例变量
类变量就是和类相关联的变量;
实例变量是和对象相关联的变量,在构造函数里通过self.变量名 来保存实例变量
class Student():
#此处定义的是类变量
sum = 0
def __init__(self, name, age):
#此处定义的是实例变量
self.name = name
self.age = age
这样在创建一个对象的时候,在括号里输入参数值,就不会得到编译器返回为空的结果了
类与对象的变量查找顺序
1、对象中内置__dict__:以字典的方式返回对象中所有变量。调用方式:对象名.dict。
注:也可以访问类的__dict__,返回当前类的所有相关变量(类变量)。调用方式:类名.dict
2、变量寻找机制:python会先在实例变量中查找 若实例变量中没有找到(__dict__中没有该变量)
python不会返回 会再去类中查找 类中找不到 会再到父类中查找
注意的坑:
机制的描述:在实例方法中如果要寻找某个变量,会先到实例中的__dict__中寻找。
在这里说会到实例中的__dict__中寻找,但是这种变量寻找机制的前提条件是,你的变量名得是self.变量名。不然会报错
self与实例方法
实例方法(与对象和实例相关联的方法,也是实例可以调用的方法)
1、实例方法在定义是参数里必须写上self
2、实例方法调用时,不用给self传参,系统自动传了
3、实例方法定义时的self也可以换成this,或者其他任意,但是python建议写self(显胜于隐)
4、self代表是实例而不是类(代表当前调用某个方法的对象,只与对象有关)
5、self可以换为别的this之类的,所以不能称之为关键字
在实例方法中访问实例变量与类变量
实例方法访问实例变量必须用到self,比如:self.变量
class Student():
sum=0
name='cde'
age=0
def __init__(self,name,age):
self.name=name
print(self.name) #打印的是实例变量ab
print(name) #打印的是形参传递的变量ab,这种方式不推荐,因为如果形参换成name1,然后将函数下第一行代码等号右边换成name1,接下来执行第三行代码会报错
print(Student.name) #打印的是在实例方法中访问的类变量cde
print(self.__class__.name) #同上
类方法
定义类方法的格式:
@classmethod
def plus_sum(cls):
pass
@classmethod是装饰器,是类方法的特征。类方法只与类相关,与对象关系不大。
@classmethod
def plus_sum(cls):
cls.sum += 1
print(cls.sum)
调用类方法:
直接用类来调用:
Student.plus_sum()
用对象来调用类的方法:
student1.plus_sum()
建议还是用类来调用。