博客信息

Python基础之面向对象-封装(魔法方法、设置属性的快捷方式、类属性与对象属性、类方法与静态方法的使用)

发布时间:『 2019-06-28 18:27』  博客类别:Python  阅读(720)

魔法方法

使用面向对象(学生管理系统v3.0

    学生类

    管理系统类

 

 

魔法方法:

    不手动调用,会自动执行的方法magic method

 

    特点:双下划线开头,双下划线结尾

students_list = []

class Student:
    def __init__(self,name,score):
        self.name = name
        self.score = score
    #手动实现__str__()方法
    def __str__(self):
        return 'name:%s score:%d' % (self.name, self.score)


class SystemManger(object):
    def __init__(self,version,name,author):
        self.version = version
        self.name = name
        self.author = author
    def showMenu(self):
        print("欢迎光临%s %s"%(self.name,self.version))
        print("1.添加学生")
        print("2.展示学生")
        print("3.退出系统")

    def addStudent(self,stu):
        students_list.append(stu)
    def showAllStudents(self):
        #<__main__.Student object at 0x0000000002258EF0>
        #<__main__.Student object at 0x0000000002258F28>
        for stu in students_list:
            print(stu)
            # name: xxx score: xxx
            # print(stu.__str__())
    def systemExit(self):
        print("谢谢使用")
        exit()
manger = SystemManger('v3.0','学生管理系统','大卫')
while True:
    manger.showMenu()
    choice = input("请选择1-3:")
    if choice == '1':
        name = input("请输入姓名")
        score = int(input("请输入分数"))
        #创建学生对象
        stu = Student(name,score)
        #调用添加学生的方法
        manger.addStudent(stu)
    elif choice == '2':
        manger.showAllStudents()
    elif choice == '3':
        manger.systemExit()
    else:
        print("选项有误,重新输入")


控制台截图:


小李飞刀_Python


__str__相当于Javatostring方法

设置属性的快捷方式

初始化方法中设置属性的其他方法:

 

def __init__(self,name,age,gender,id,score)

    self.name = name

...

 

class Student(object):
    def __init__(self,name,age,gender,id,score,address,tel,height,weight):
        # self.name = name
        # pass
        # 获得实例化对象传递过来的所有属性及属性值
        dic = locals()
        # print(type(dic))
        # print(dic)
        # dic.pop('self')
        # print(dic)
        for k,v in dic.items():
            #设置属性的函数
            setattr(self,k,v)

    def showInfo(self):
        print("name:%s age:%d 性别:%s"%(self.name,self.age,self.gender))

stu = Student('zs',18,'男','1001',89,'叫春的城市','15888888888',130,130)

stu.showInfo()


类属性与对象属性

1.什么叫类变量:

        变量定义在类中,方法外,属于类所有,所有对象共享一份

 

    2.与成员变量有什么区别?

        定义位置不同

        属于者不同

            成员变量属于对象

            类变量属于类

        存储份数不同:

            成员变量:

                每个对象中都有一份

            类变量:

                只有一份,供所有对象共享

 

    为什么要使用类变量?

        存储份数唯一

 

    什么情况下使用类变量?

 

 

    如何使用类变量?

    类变量的访问:

        1.获取值

            a.类名.类属性名

            b.对象名.类属性名

        2.设置值

            类名.类属性名 = 对应值

            对象名.类属性名 = 对应值

 

        如果存在与类属性名相同的对象属性,

        用对象名.属性名 优先访问 对象的


class Student():
    #类变量定义类内,方法外
    class_id = 210
    def __init__(self,name,age):
        self.name = name
        self.age = age
        # self.class_id = 100
stu1 = Student('马哥',38)
stu2 = Student('大龙哥',66)

print("%s所在教室:%d"%(stu1.name,stu1.class_id))
print("%s所在教室:%d"%(stu1.name,Student.class_id))
#将教室id更改为211
Student.class_id = 211
#这种方式等于是给对象stu1中增加一个成员变量class_id
# stu1.class_id = 211
print("更改教室后:")
print("%s所在教室:%d"%(stu1.name,Student.class_id))
print("%s所在教室:%d"%(stu1.name,stu2.class_id))


注意:

类属性值修改,改的是常量池中的值

对象属性值修改,并不能影响常量池中的数据,本质上是在对象中添加了一个属性值

 

类方法与静态方法的使用

行为

        成员方法

            对象方法、类方法、静态方法

 

        类方法

            1.装饰器

                @classmethod

            2.有一个必要参数:

                cls

 

        访问方式:

            1.类名.类方法名()

            2.对象名.类方法名()

 

        类方法中:

            在类方法中可不可以访问当前类中的属性

            在类方法中,不能使用self关键字

 

        好处:

            直接类名调用,不用创建对象

 

 

        静态方法

            @staticmethod

            没有参数

            类名调用

class Student():
    #类变量定义类内,方法外
    class_id = 210
    def __init__(self,name,age):
        self.name = name
        self.age = age
    #在成员方法中能否访问类方法  -->以下三种方式都可以调用类方法
    def test(self):
    #     Student.test1()
    #     self.test1()
    #     self.__class__.test1()
        print("我是对象方法")
        # Student.test2()
        # self.test2()
        # self.__class__.test2()

    @classmethod
    def test1(cls):
        print("我是类方法")
        print("class_id:%d"%Student.class_id)
        print("class_id:%d"%cls.class_id)
        # print("name:%s"%self.name)
        # print("age:%s"%self.name)
        # Student('学生1',19).test()
        Student.test2()
    @staticmethod
    def test2():
        print("我是静态方法")
        Student('学生1',19).test()
        # Student.test1()


Student.test1()
#使用对象访问类方法
stu1 = Student('学生1',18)
# stu1.__class__.test1()
stu1.test()
Student.test2()
# stu1.test2()


注意:

1、对象方法中可以调用类方法

2、类方法中可以调用对象方法

3、对象方法可以调用静态方法

4、静态方法可以调用对象方法

5、静态方法可以调用类方法

6、类方法可以调用静态方法

结论:

类方法、静态方法、对象方法之间可以相互调用


over......


关键字:     Python基础       面向对象  

备案号:湘ICP备19000029号

Copyright © 2018-2019 javaxl晓码阁 版权所有