来源:python中国网 时间:2019-06-06

  面向对象编程的2个非常重要的概念:类和对象

  将具有共同特征和行为的一组事物抽象定义,提出了另外一个新的概念——类,类里面可以有自己的变量(叫做属性)和函数(叫做方法),每个类可以创造自己的对象实例,对象是面向对象编程的核心,对象其实也是一种变量!

  一:定义类的语法规范

	class类名:
	
	   属性..
	
	   方法...

  1、类定义使用class关键字,以冒号:作为类体的开始,统一缩进的部分作为类体。

  2、从语法上看,类名只要是一个合法的标识符即可;从可读性来看,类名最好由一个或多个有意义的单词连缀而成的,每个单词首字母大写。

  二:定义类并创建和使用对象

  1、定义空类
 

# ‐*‐ coding: utf‐8 ‐*‐

class A: # 只有类名
    pass 


  2、定义学生类

  1)实例属性(实例名.属性),每个实例的内存是独立的。

  类的实例属性是指只有类实例对象才拥有(能访问)的属性,形式如self.属性名。类实例属性一般是在构造函数(__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)叫类属性(也叫静态属性)。

  类属性只能通过类名进行修改,实例对象可以访问类属性,如果对象实例更改类属性实际上是给对象额外添加了一个属性。

  同一个类的所有实例对象,共享一个类属性,也就是它们访问出来的值是一样的。

# ‐*‐ 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),在对象使用该方法的时候会自动的将自身作为参数传入到方法中,这样在对象的实例方法中才能通过类实例(self)调用它自己的属性或者其它对象的实例方法。

  类里面可以有多个实例方法,他们之间可以互相调用。  

# ‐*‐ 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__方法说明

  构造函数,在生成对象时调用,类用该方法来创建自己的实例。如果没有定义或覆盖__init__()方法,则对实例不会施加任何特别的操作。如果实现了__init__()方法,那么就会自动调用__init__()方法,然后进行初始化。

  有参构造:就是构造函数中带有参数(self除外),通过这些参数来给实例属性进行初始化。有参构造需要在类实例化的时候就把对应的参数传递进去。

  无参构造:就是构造函数中没有除了self之外的参数,实例化的时候不需要传入参数。

  6)self说明

  self在实例化时自动将对象/实例本身传给init的第一个参数,你也可以给他起个别的名字,但是正常人都不会这么做,因为你瞎改别人就不认识。self的含义就像中文“我的”一样,每个人介绍自己的时候都说【我的】名字是xxx,虽然都是【我的】两个相同的字,但是含义是代表自身!