面向对象编程的2个非常重要的概念:类和对象
将具有共同特征和行为的一组事物抽象定义,提出了另外一个新的概念——类,类里面可以有自己的变量(叫做属性)和函数(叫做方法),每个类可以创造自己的对象实例,对象是面向对象编程的核心,对象其实也是一种变量!
一:定义类的语法规范
class类名:
属性..
方法...
1、类定义使用class关键字,以冒号:作为类体的开始,统一缩进的部分作为类体。
2、从语法上看,类名只要是一个合法的标识符即可;从可读性来看,类名最好由一个或多个有意义的单词连缀而成的,每个单词首字母大写。
二:定义类并创建和使用对象
1、定义空类
# ‐*‐ coding: utf‐8 ‐*‐
class A: # 只有类名
pass
2、定义学生类
1)实例属性(实例名.属性)
通过一个类创建一个对象,那么这个对象就叫做这个类的实例,他们有一下特点:
1>每个实例的内存是独立的。
2>类的实例属性是指只有类实例对象才拥有(访问)的属性,形式如self.属性名。
3>类实例属性一般是在构造方法__init__()中创建和初始化的(构造方法的概念往下看)。
# ‐*‐ coding: utf‐8 ‐*‐
class Student:
def __init__(self,name,age):
self.name = name #实例属性
self.age = age #实例属性
def print_info(self):
print("我的名字是{},年龄{}".format(self.name,self.age))
stu1 = Student('小王',18)
print(stu1.age,stu1.name)
stu2 = Student('老王',38)
print(stu2.age,stu2.name)
D:installpython3python.exe D:/pyscript/test/test.py
18 小王
38 老王
Process finished with exit code 0
2)类属性(类名.属性)
直接声明在类下面的属性(属性名前面没有self)叫类属性(也叫静态属性)。
1>类属性的内存和实例属性内存互相独立。
2>类属性只能通过类名进行修改,实例对象可以访问类属性,如果一个实例对象去更改类属性实际上是给自己单独添加一个属性。
3>同一个类的所有实例对象,共享一个类属性,也就是它们访问出来的值是一样的。
# ‐*‐ coding: utf‐8 ‐*‐
class Student(object):
# 学员计数不能存在实例里,因为每个实例的内存是独立的,每实例化一次,数据就会被重置一次,不会累加
stu_num = 0
address = "朝阳区"
def __init__(self,name):
self.name = name
Student.stu_num += 1
stu1 = Student('小王')
stu1 = Student('中王')
stu1 = Student('老王')
print("班级人数",Student.stu_num)
print("类的地址",stu1.address)
stu1.address = "东城区"
print("学生stu1地址",stu1.address)
print("类的地址",Student.address)
D:installpython3python.exe D:/pyscript/test/test.py
班级人数 3
类的地址 朝阳区
学生stu1地址 东城区
类的地址 朝阳区
Process finished with exit code 0
3)实例方法
实例方法只能实例来调用,函数里面第一个参数是self就是实例方法,构造方法也属于实例方法。
1>实例方法的第一个参数是实例对象本身(self),在对象调用该方法的时候会自动的将自身作为参数传入到方法中。这样在对象的实例方法中才能通过类实例(self)调用它自己的属性或者其它实例方法。
2>类里面可以有多个实例方法,他们之间可以互相调用。
# ‐*‐ coding: utf‐8 ‐*‐
class Student:
def __init__(self,name,age):
self.name = name #实例属性
self.age = age #实例属性
def print_info(self,hobby):
print("我的名字是{},年龄{}".format(self.name,self.age))
print("我的爱好是{0}".format(hobby))
self.study()# 调用别的实例方法
def study(self):
print("我喜欢在www.python66.com学习")
stu1 = Student('小王',18)
stu1.print_info("打球")
stu2 = Student('老王',38)
stu2.print_info("健身")
D:installpython3python.exe D:/pyscript/test/test.py
我的名字是小王,年龄18
我的爱好是打球
我喜欢在www.python66.com学习
我的名字是老王,年龄38
我的爱好是健身
我喜欢在www.python66.com学习
Process finished with exit code 0
4)类方法
类方法通过@classmethod装饰器实现,类方法和普通方法的区别是,类方法只能访问类变量,不能访问实例变量,第一个参数是类本身(cls)。(给大家一个应用场景:每多一个学生实例,学生人数+1)。
# ‐*‐ coding: utf‐8 ‐*‐
class Student(object):
__stu_num = 0 # 学员计数需存在类变量里,不能存在每个实例里
def __init__(self,name):
self.name = name
self.add_stu_num() # 相当于Student.add_stu_num() 初始化学员时调用
@classmethod
def add_stu_num(cls): # 注意这里调用时传进来的其实是类本身,不是实例本身,所以参数名一般改为cls
cls.__stu_num += 1
print("total student num:",cls.__stu_num)
s1 = Student("张1")
s2 = Student("张2")
s3 = Student("张3")
s4 = Student("张4")
Student.add_stu_num() # 也可以这样调
D:installpython3python.exe D:/pyscript/test/test.py
total student num: 1
total student num: 2
total student num: 3
total student num: 4
total student num: 5
Process finished with exit code 0
5)__init__方法说明
构造方法,顾名思义就是构造对象用的,在创建对象的时候把对象应该有的特征定义出来,换言之,构造方法是用来是初始化对象的。
1>构造方法在创建对象时会被调用,不用你手动去调用,在创建对象的刹那就会触发它!类用该方法来创建自己的实例。
2>如果没有定义或覆盖__init__()方法,则对实例不会施加任何操作。如果不手动为类添加构造方法,python也会自动为类添加一个仅包含 self参数的构造方法。
3>如果实现了__init__()构造方法,那么创建对象就会调用__init__()方法来进行初始化。
4>有参构造:就是构造方法中带有参数(self除外),通过这些参数来给实例进行初始化。有参构造需要在创建对象的时候就把参数传递进去。
5>无参构造:就是构造方法中没有除了self之外的参数,实例化的时候不需要传入参数。
6)self说明
1>self作为构造方法或者其他实例方法的第一个参数,他的意思代表对象本身,即每一个对象在调用方法的时候会自动将对象本身传作为该方法的第一个参数。你通过哪个对象去调用方法,那么这个方法的self参数就指向谁。这个过程的实现是python解释器为你做的,你不需要做什么。
2>self的含义就像中文“我的”一样,每个人介绍自己的时候都说【我的】名字是xxx,虽然都是【我的】两个相同的字,但是含义是代表自身!
3>self是通用的变量名,你也可以给他起个别的名字(在php中用的是this),但是正常人都不会这么做,因为你瞎改别人就不熟悉了。