美文网首页
类中的方法和属性

类中的方法和属性

作者: pubalabala | 来源:发表于2018-08-01 22:04 被阅读0次

内置属性

"""__author__ == Jefferson"""

'''
内置类属性: python中每个类都拥有内置的类属性
__name__
__doc__
__dict__
__module__
__bases__



'''
class Animal:
    '''动物'''
    pass

class Cat(Animal):
    '''说明: 猫'''
    number = 0
    def __init__(self,name = '',color = ''):
        self.name = name
        self.color = color

    def run(self):
        print('%s在跑'%self.name)

    @staticmethod
    def shout():
        print('喵~')

    @classmethod
    def get_number(cls):
        print('猫的数量:%d'%cls.number)



if __name__ == '__main__':
    cat = Cat('大白','白色')
    '''
    1. 类名.__name__
    获取类的名字(字符串)
    '''
    print(Cat.__name__)

    '''
    2. 类名.__doc__
    获取类的说明文档
    '''
    print(Cat.__doc__)

    '''
    3. 类名.__dict__: 获取所有的属性和对应的值, 以键值对的形式存到字典里
        对象名.__dict__: 将对象的属性和对应的值, 转换成字典的元素(常用)
    
    '''
    print(Cat.__dict__)
    print(cat.__dict__)

    '''
    4. 类名.__module__:获取当前类所在模块的名字
    '''
    print(Cat.__module__)

    '''
    5. 类名.__bases__: 查看当前类的父类
    '''
    print(Cat.__bases__)
Cat
说明: 猫
{'__module__': '__main__', '__doc__': '说明: 猫', 'number': 0, '__init__': <function Cat.__init__ at 0x000001D67FFA9510>, 'run': <function Cat.run at 0x000001D67FFA9598>, 'shout': <staticmethod object at 0x000001D67FFA64A8>, 'get_number': <classmethod object at 0x000001D67FFA64E0>}
{'name': '大白', 'color': '白色'}
__main__
(<class '__main__.Animal'>,)

私有化

"""__author__ == Jefferson"""

'''
python中类的属性和方法的私有化: 直接在属性名或者方法名前加'__'
属性或者方法私有: 在外部不能直接使用, 只能通过内部成员使用

'''

class Person:
    '''人类'''

    __number = 60

    def __init__(self,name = '', age = '0'):
        self.name = name
        self.__age = age

    def show_age(self):
        self.__run()
        return self.__age

    #私有方法只能在类的内部调用
    def __run(self):
        print('run!')

if __name__ == '__main__':
    p1 = Person('张三', '20')
    p1.name = '李四'
    print(p1.name,p1.show_age())
    print(p1._Person__age)
run!
李四 20
20

getter和setter

"""__author__ == Jefferson"""
'''
属性假的私有化: 声明对象属性的时候, 在属性名前面加一个'_', 来告诉别人这个属性不可以直接使用,要通过getter和setter来获取和修改属性的值
1. getter: 获取属性的值
@property
def 属性名(self):
    return self._name
如果在获取对象的某个属性前需要再干点别的事情, 就给属性添加getter

2. setter: 给属性赋值
一个属性必须要有getter然后才能添加setter

如果在获取对象的某个属性前需要再干点别的事情, 就给属性添加getter

@属性名(去掉下划线).setter
def 属性名去掉下划线(self, 变量名):
    给下划线的属性赋值
    
如果

'''

class Student:
    '''学生类'''
    def __init__(self):
        #声明属性的时候前面加一个'_'是为了告诉别人这个属性不能直接使用
        self._name = ''
        self._score = 0
        self._age = 0

    #给属性_name添加getter
    @property
    def name(self):
        return self._name

    #给属性_name添加setter
    @name.setter
    def name(self, value):
        self._name = value

    @property
    def score(self):
        return self._score

    @score.setter
    def score(self,value):
        self._score = value

    @property
    def age(self):
        return self._age

    @age.setter
    def age(self,value):
        if value >= 150 or value < 0:
            self._age = value



if __name__ == '__main__':
    stu1 = Student()
    #不添加getter和setter
    stu1._name = '李四'
    print(stu1._name)
    #添加getter和setter
    stu1.name = '张三'
    print(stu1.name)
李四
张三

类的继承

"""__author__ == Jefferson"""
'''

子类: 继承者
父类(超类): 被继承者

1. 继承基础
python中类是可以继承的, 并且支持多继承
class 类名(父类)

说明: python中所有的类都默认继承python的基类: object

2. 能继承哪些内容
继承: 直接拥有父类的属性和方法
a. 对象的属性和方法, 类的字段和类方法, 静态方法都可以继承(私有的继承无意义--不能继承)
b. __solts__的值不会被继承
c. getter和setter会被继承
'''
class Person:
    '''人'''
    __slots__ = ('name','__age','_sex')
    def __init__(self):
        self.name = ''
        self.__age = '0'
        self._sex = '男'

    def eat(self):
        print("%s在吃饭"%self.name)

    #类字段
    number = 61

    @classmethod
    def get_number(cls):
        print('Person类:%d'%cls.number)

    @staticmethod
    def hurt_earth():
        print('Person类静态方法')

class Student(Person):
    '''学生'''
    pass


if __name__ == '__main__':
    stu = Student()
    stu.name = '小明'
    print(stu.name,stu.number)
    stu.eat()
    stu.get_number()
    stu.hurt_earth()
    print(stu.__dict__)
    stu.id = 123
    print(stu.id)

小明 61
小明在吃饭
Person类:61
Person类静态方法
{}
123

practice

"""__author__ == Jefferson"""

import json
try:
    with open('./data.json','r',encoding='utf-8') as file:
        data = json.load(file)
except:
    print('读取文佳佳错误')

class Data:
    '''数据类'''
    def __init__(self):
        self.type = ''
        self.text = ''
        self.user_id = ''
        self.name = ''
        self.screen_name = ''
        self._width = 0
        self._height = 0
        self._themes = ''

    @property
    def width(self):
        return self._width

    @width.setter
    def width(self,value):
        if value.isdigit():
            self._width = int(value)
        else:
            print('转换出错!')

    @property
    def height(self):
        return self._height

    @height.setter
    def height(self, value):
        if value.isdigit():
            self._height = int(value)
        else:
            print('转换出错!')

    @property
    def themes(self):
        return self._themes

    @themes.setter
    def themes(self, value):
        if value == None:
            self._themes = '无'
        else:
            self._themes = value

    def __str__(self):
        return 'type:'+self.type+'\ntext:'+self.text+\
               '\nuser_id:'+self.user_id+'\nname:'+\
               self.name+'\nscreen_name:'+self.screen_name+\
               '\nwidth:%s'%self.width+'\nheight:%d'%self.height+\
               '\nthemes:'+self.themes
    @classmethod
    def data_in(cls,dic):
        d = cls()
        for key in dic:
            if key == 'width':
                d.width = dic['width']
            elif key == 'height':
                d.height = dic['height']
            elif key == 'themes':
                d.themes = dic['themes']
            else:
                d.__setattr__(key,dic[key])
        return d


if __name__ == '__main__':
    d1 = Data.data_in(data['data'][0])
    d2 = Data.data_in(data['data'][1])
    print(d1)
    print()
    print(d2)
type:41
text:胡萝卜造型的可爱多功能雨伞,了解一下
user_id:21088861
name:蒙面女侠Y
screen_name:蒙面女侠Y
width:360
height:636
themes:无

type:41
text:水陆两栖,自由变换,还不快来围观一下吗!
user_id:15262111
name:共醉江湖
screen_name:共醉江湖
width:1024
height:576
themes:无

练习 员工管理系统

"""__author__ == Jefferson"""
import json
operater = 1#预设操作人员
staff_info = {'worker_id': 0, 'staffs': [], 'department': []}

class Staff:
    number = len(staff_info['staffs'])
    staff_id = staff_info['worker_id']

    def __init__(self):
        self.name = ''
        self._age = 0
        self.job_number = 'python1805'
        self._salary = 0
        self.position = '员工'
        self.department = '流水线'

    def __str__(self):
        return '员工信息:\n姓名:'+self.name+'\n年龄:%d'%self.age+'\n工号:'+self.job_number+'\n薪资:%d'%self.salary+'\n职位:'+self.position+'\n部门:'+self.department

    @classmethod
    def load(cls,dic):
        staff = cls()
        for key in dic:
            if key == 'age':
                staff.age = dic['age']
            elif key == 'salary':
                staff.salary = dic['salary']
            else:
                staff.__setattr__(key,dic[key])
        return staff

    @property
    def age(self):
        return self._age

    @age.setter
    def age(self,value):
        while value.isdigit()!=True or int(value) < 15 or int(value) > 100:
            value = input('你输入的年龄不合法,请重新输入:')
        self._age = int(value)

    @property
    def salary(self):
        return self._salary

    @salary.setter
    def salary(self, value):
        while value.isdigit() != True or int(value) < 0:
            value = input('你输入的工资不合法,请重新输入:')
        self._salary = int(value)

    @classmethod
    def add_staff(cls):
        staff = cls()
        print('新员工入职')
        cls.staff_id += 1
        staff.job_number = 'python1805'+str(cls.staff_id).rjust(3,'0')
        staff.name = input('员工姓名:')
        staff.age = input('年龄:')
        staff.salary = input('薪资:')
        staff.position = input('请输入员工职位:')
        while True:
            print('请选择部门')
            for index in range(len(staff_info['department'])):
                print('%d. %s'%(index+1,staff_info['department'][index]))
            i = input('请输入部门序号:')
            if i.isdigit()==False or int(i)<=0 or int(i)>index+1:
                print('请输入正确的序号.')
            else:
                staff.department = staff_info['department'][int(i)-1]
                break
        print('添加成功!')
        staff_info['staffs'].append(staff)

    @classmethod
    def del_staff(cls):
        job_number = input('请输入要删除的员工号:')
        i = 0
        for iterm in staff_info['staffs']:
            if iterm.job_number == job_number:
                print('员工信息:\n',iterm)
                staff_info['staffs'].remove(iterm)
                print('员工已删除!')
                i += 1
                break
        if i == 0:
            print('该员工不存在!')

    @staticmethod
    def find_staff():
        name = input('请输入要查找的员工姓名:')
        i = 0
        for item in staff_info['staffs']:
            if item.name == name:
                print('查找结果:')
                print(item)
                i+=1
        if i == 0:
            print('该员工不存在!')

    @staticmethod
    def find_salary():
        print('请选择部门:')
        while True:
            print('请选择部门')
            for index in range(len(staff_info['department'])):
                print('%d. %s'%(index+1,staff_info['department'][index]))
            i = input('请输入部门序号:')
            if i.isdigit()==False or int(i)<=0 or int(i)>index+1:
                print('请输入正确的序号.')
            else:
                break
        staff = staff_info['staffs'][0]
        for item in staff_info['staffs']:
            if item.department == staff_info['department'][int(i)-1] and item.salary >staff.salary:
                staff = item
        print('工资最高的员工信息如下:')
        print(staff)

    @staticmethod
    def avg_age():

        age_sum = 0
        for item in staff_info['staffs']:
            age_sum += item.age
        print('公司全体员工的平均年龄为:%.1f'%(age_sum/len(staff_info['staffs'])))

    @staticmethod
    def add_department():
        department = input('请输入要添加的部门名称:')
        for item in staff_info['department']:
            if item == department:
                return '该部门已存在!'
        staff_info['department'].append(department)
        return '添加成功!'

try:
    with open('./Infomation.json','r',encoding='utf-8') as file:
        info = json.load(file)
        for index in range(len(info['staffs'])):
            staff_info['staffs'].append(Staff.load(info['staffs'][index]))
        staff_info['worker_id'] = info['worker_id']
        staff_info['department'] = info['department']
except:
    file = open('./Infomation.json','w')
    file.close()


#主菜单函数
def menu():
    while True:
        if operater != '':
            print('\tStaff Management\t'.center(36,'*'))
            print('**'+'\t1. 员工入职\t'.center(29,' ')+' **')
            print('**' + '\t2. 删除员工\t'.center(29, ' ') + ' **')
            print('**' + '\t3. 查找员工\t'.center(29, ' ') + ' **')
            print('**' + '\t4. 薪资最高\t'.center(29, ' ') + ' **')
            print('**' + '\t5. 平均年龄\t'.center(29, ' ') + ' **')
            print('**' + '\t6. 添加部门\t'.center(29, ' ') + ' **')
            print('**' + '\t7. 退出系统\t'.center(29, ' ') + ' **')
            print('*'*40)
            while True:
                n = input('请选择要执行的操作:')
                if n == '1':
                    Staff.add_staff()
                    break
                elif n == '2':
                    Staff.del_staff()
                    break
                elif n == '3':
                    Staff.find_staff()
                    input()
                    break
                elif n == '4':
                    Staff.find_salary()
                    break
                elif n == '5':
                    Staff.avg_age()
                    break
                elif n == '6':
                    print(Staff.add_department())
                    break
                elif n == '7':
                    with open('./Infomation.json', 'w') as file:
                        for index in range(len(staff_info['staffs'])):
                            staff_info['staffs'][index] = staff_info['staffs'][index].__dict__
                        json.dump(staff_info,file)
                    exit()
                else:
                    print('请输入正确的序号!')

if __name__ == '__main__':
    menu()
*********   Staff Management    *********
**              1. 员工入职            **
**              2. 删除员工            **
**              3. 查找员工            **
**              4. 薪资最高            **
**              5. 平均年龄            **
**              6. 添加部门            **
**              7. 退出系统            **
****************************************
请选择要执行的操作:6
请输入要添加的部门名称:迎宾
添加成功!
*********   Staff Management    *********
**              1. 员工入职            **
**              2. 删除员工            **
**              3. 查找员工            **
**              4. 薪资最高            **
**              5. 平均年龄            **
**              6. 添加部门            **
**              7. 退出系统            **
****************************************
请选择要执行的操作:收银
请输入正确的序号!
请选择要执行的操作:6
请输入要添加的部门名称:收银
该部门已存在!
*********   Staff Management    *********
**              1. 员工入职            **
**              2. 删除员工            **
**              3. 查找员工            **
**              4. 薪资最高            **
**              5. 平均年龄            **
**              6. 添加部门            **
**              7. 退出系统            **
****************************************
请选择要执行的操作:1
新员工入职
员工姓名:张三
年龄:21
薪资:1523
请输入员工职位:员工
请选择部门
1. 收银
2. 海鲜
3. 熟食
4. 迎宾
请输入部门序号:2
添加成功!
*********   Staff Management    *********
**              1. 员工入职            **
**              2. 删除员工            **
**              3. 查找员工            **
**              4. 薪资最高            **
**              5. 平均年龄            **
**              6. 添加部门            **
**              7. 退出系统            **
****************************************
请选择要执行的操作:1
新员工入职
员工姓名:李四
年龄:35
薪资:25000
请输入员工职位:主管
请选择部门
1. 收银
2. 海鲜
3. 熟食
4. 迎宾
请输入部门序号:2
添加成功!
*********   Staff Management    *********
**              1. 员工入职            **
**              2. 删除员工            **
**              3. 查找员工            **
**              4. 薪资最高            **
**              5. 平均年龄            **
**              6. 添加部门            **
**              7. 退出系统            **
****************************************
请选择要执行的操作:1
新员工入职
员工姓名:王五
年龄:32
薪资:2533
请输入员工职位:员工
请选择部门
1. 收银
2. 海鲜
3. 熟食
4. 迎宾
请输入部门序号:1
添加成功!
*********   Staff Management    *********
**              1. 员工入职            **
**              2. 删除员工            **
**              3. 查找员工            **
**              4. 薪资最高            **
**              5. 平均年龄            **
**              6. 添加部门            **
**              7. 退出系统            **
****************************************
请选择要执行的操作:3
请输入要查找的员工姓名:张三
查找结果:
员工信息:
姓名:张三
年龄:21
工号:python1805001
薪资:1523
职位:员工
部门:海鲜


*********   Staff Management    *********
**              1. 员工入职            **
**              2. 删除员工            **
**              3. 查找员工            **
**              4. 薪资最高            **
**              5. 平均年龄            **
**              6. 添加部门            **
**              7. 退出系统            **
****************************************
请选择要执行的操作:请输入正确的序号!
请选择要执行的操作:
请输入正确的序号!
请选择要执行的操作:3
请输入要查找的员工姓名:李四
查找结果:
员工信息:
姓名:李四
年龄:25
工号:python1805001
薪资:1324
职位:员工
部门:收银
查找结果:
员工信息:
姓名:李四
年龄:35
工号:python1805002
薪资:25000
职位:主管
部门:海鲜


*********   Staff Management    *********
**              1. 员工入职            **
**              2. 删除员工            **
**              3. 查找员工            **
**              4. 薪资最高            **
**              5. 平均年龄            **
**              6. 添加部门            **
**              7. 退出系统            **
****************************************
请选择要执行的操作:请输入正确的序号!
请选择要执行的操作:2
请输入要删除的员工号:python1805001
员工信息:
 员工信息:
姓名:李四
年龄:25
工号:python1805001
薪资:1324
职位:员工
部门:收银
员工已删除!
*********   Staff Management    *********
**              1. 员工入职            **
**              2. 删除员工            **
**              3. 查找员工            **
**              4. 薪资最高            **
**              5. 平均年龄            **
**              6. 添加部门            **
**              7. 退出系统            **
****************************************
请选择要执行的操作:4
请选择部门:
请选择部门
1. 收银
2. 海鲜
3. 熟食
4. 迎宾
请输入部门序号:1
工资最高的员工信息如下:
员工信息:
姓名:王五
年龄:32
工号:python1805003
薪资:2533
职位:员工
部门:收银
*********   Staff Management    *********
**              1. 员工入职            **
**              2. 删除员工            **
**              3. 查找员工            **
**              4. 薪资最高            **
**              5. 平均年龄            **
**              6. 添加部门            **
**              7. 退出系统            **
****************************************
请选择要执行的操作:3
请输入要查找的员工姓名:王五
查找结果:
员工信息:
姓名:王五
年龄:32
工号:python1805003
薪资:2533
职位:员工
部门:收银

*********   Staff Management    *********
**              1. 员工入职            **
**              2. 删除员工            **
**              3. 查找员工            **
**              4. 薪资最高            **
**              5. 平均年龄            **
**              6. 添加部门            **
**              7. 退出系统            **
****************************************
请选择要执行的操作:4
请选择部门:
请选择部门
1. 收银
2. 海鲜
3. 熟食
4. 迎宾
请输入部门序号:2
工资最高的员工信息如下:
员工信息:
姓名:李四
年龄:35
工号:python1805002
薪资:25000
职位:主管
部门:海鲜
*********   Staff Management    *********
**              1. 员工入职            **
**              2. 删除员工            **
**              3. 查找员工            **
**              4. 薪资最高            **
**              5. 平均年龄            **
**              6. 添加部门            **
**              7. 退出系统            **
****************************************
请选择要执行的操作:5
公司全体员工的平均年龄为:29.3
*********   Staff Management    *********
**              1. 员工入职            **
**              2. 删除员工            **
**              3. 查找员工            **
**              4. 薪资最高            **
**              5. 平均年龄            **
**              6. 添加部门            **
**              7. 退出系统            **
****************************************
请选择要执行的操作:7

相关文章

  • Swift2.2 关于Class一些基础知识的总结

    类是对象的模板 类中包含 属性 和 方法属性和方法都是类的组成部分,属性是变量,方法是函数方法中的代码可以利用se...

  • 读、画 UML 类图

    一、表示类的属性和方法 类中包括属性和方法。属性定义的形式:可见性 名称 : 类型 [= 缺省值]方法定义的形式:...

  • Python魔法方法-__dict__

    __dict__ 类或对象中的所有属性类的实例属性属于对象;类中的类属性和方法等属于类,即:

  • 类和对象 属性和方法 的 对应英文

    类中定义的属性和方法被称为attributes和methods,而从类中实例化的对象的属性和方法被称为proper...

  • 类中的方法和属性

    内置属性 私有化 getter和setter 类的继承 practice 练习 员工管理系统

  • 类中的属性和方法

  • 抽象类、接口

    **抽象类** 特点:1.抽象类中可以构造方法2.抽象类中可以存在普通属性,方法,静态属性和方法。3.抽象类中可以...

  • day014 笔记 08-01

    内置类的属性 python中每个类都拥有内置的类属性。 私有化 python中类中的属性和方法的私有化:直接在属性...

  • 接口与抽象类

    抽象类 特点: 1.抽象类中可以构造方法 2.抽象类中可以存在普通属性,方法,静态属性和方法。 3.抽象类中可以存...

  • @classmethod和@staticmethod的区别

    简介 类的成员 python中类的成员可以分为三大类:字段、方法和属性 类的方法 包括:普通方法、静态方法和类方法...

网友评论

      本文标题:类中的方法和属性

      本文链接:https://www.haomeiwen.com/subject/zcldvftx.html