Python进阶--------高级部分之面向对象

1.类的简单架构:

# 面向对象
# 类的最基本作用:封装代码
 
class Student():
    name = "菲神"
    age = 18
# 在类的里面写函数必须加上self即可
    def print_Students_files(self):
        print("I am "+self.name)
        print("I am "+str(self.age)+" years old")

# Python对象实例化的操作
student = Student()
#调用的是类方法而不是函数
student.print_Students_files()

注意:1.在类的里面定义函数需要在括号里加入self

           2.在print里面若直接写成print(“I am ”+name)编译会出错,解决的方式如上面所示通过self.name的方式,如果不是在类里面而是在模块,定义name属于全局变量,直接+name是正确的

          3.实例化对象的时候Python不需要通过关键字new对象,而是直接写就可以,如上面所示

          4.调用的是类方法而不是函数(二者是有区别的,下面会有介绍)

代码的运行结果:

问题: d1中存在一个学生类,那么如何在另一个模块下访问这个类:

解决方案:我在同一文件夹下创立了一个d2.py文件

代码如下:(也就是说我们写代码最好将测试类也就说实例化对象的时候新开辟一个新的文件)

# d1中存在一个学生类,那么如何在另一个模块下访问这个类:
from d1 import Student

student = Student()
student.print_Students_files()

运行结果:从下面的运行结果来看答案如期而至

案例代码1:

class Student():
    name = ""
    age  = 20 
    # 构造函数:
    def __init__(self):
        print("student")
# 构造函数的调用是自动进行的
student = Student()
student.__init__()

运行结果:

问题:为什么出现两个student?

解释:构造函数的调用是自动进行的

案例代码2:

class Student():
    # 这实际就是类变量
    name = ""
    age  = 20 
    # 构造函数:
    def __init__(self, name, age):
        # 初始化对象的属性
        self.name = name
        self.age = age
        print("student")
student = Student("菲神", 18)
print(student.name)
print(student.age)

运行结果:

注解:

1.在初始化对象的属性时如果这样写:

name = name
age = age

运行的结果:

发现的问题:第一没有名字打出来,第二年龄age虽然打印出来,但是结果并不是我们给出的实参,而是一开始默认的年龄是20

解决方案:问题来源于初始化对象属性发生的,即我们正确写代码的方式为:

# 这实际就是实例变量
self.name = name
self.age = age

问题:为什么会出现上述的情况,运行的结果为什么是一开始定义的 初始化的值呢????

答:在 初始化那里name=name age=age是局部变量,而不会改变全局变量,当访问实例变量,就会先从对象的实例列表里面寻找里面有没有name和age变量如果没有,不先返回None而是去到类变量寻找,这就是为什么不加self是打印的却是类变量的初始值。

区别类变量和实例变量:看上述的代码区”

 访问实例对象的信息:(就是说打印出你所创建对象的信息(实参))

# 在上面类的代码的基础上

  student1 = Student("菲神2019", 19)

  print(student1.__dict__)

运行结果:

构造函数的不仅仅可以用self还可以使用其他:可是Python建议我们最好使用self

def __init__(this, name, age):
    this.name = name
    this.age = age
#运行结果和上述一模一样

2.在构造函数的内部来访问类变量该如何做:

class Student():
    name = "勒布朗"
    age  = 20 
    sum1 = 0
    # 构造函数:
    def __init__(self, name, age):
        # 初始化对象的属性
        self.name = name
        self.age = age
        print(sum1)

运行结果:很明显,在构造函数里面是不能直接访问类变量的

解决方案:

class Student():
    sum1 = 0
    
    def __init__(self)
    
    # 方法一
    在构造函数里面访问:
    print(Student.sum1)
    print(self.__class__.sum1)
    # 在外面访问
print(Student.sum1)

运行结果:注意self.__class__.sum1的访问类变量的方式:

3.类变量的作用以及类变量的使用场景:

案例1:注意的是print(字符串+str(数据例如int))的写法

class Student():
    name = ""
    age = 0
    # 统计当前班级人数
    sum = 0

    def __init__(self, name, age):
        self.name = name
        self.age = age
        self.__class__.sum += 1
        print("当前的班级的人数为:" + str(self.__class__.sum))
# 对象实例化的过程:
student1 = Student("菲神", 19)
student2 = Student("詹姆斯", 19)
student3 = Student("库里", 20)
print("班级的总人数为:" + str(Student.sum))

运行结果:

4.在Python里类方法和实例方法的区别:

参考:http://www.cnblogs.com/wcwnina/p/8644892.html

5.博主的案例------如何写类方法以及类方法的使用:还是上述的代码使用类方法来统计班级的人数

class Student():
    name = ""
    age = 0
    # 统计当前班级人数
    sum = 0

    
    def __init__(self, name, age):
        self.name = name
        self.age = age
    
    # 实例方法
    def dohomework(self):
        print("do your homework")

    # 类方法
    @classmethod
    def plus_sum(cls):
        cls.sum += 1
        print(cls.sum)

student1 = Student("菲神", 19)
Student.plus_sum()
student2 = Student("詹姆斯", 19)
Student.plus_sum()
student3 = Student("库里", 20)
Student.plus_sum()
print("班级的总人数为:" + str(Student.sum))

运行结果:

发布了98 篇原创文章 · 获赞 34 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/weixin_42133768/article/details/88074515
今日推荐