zoukankan      html  css  js  c++  java
  • pyton 封装

    定义:在类中将方法和属性隐藏起来

    一、私有化

    1、格式

    __名字,在名字前加双下划线

    2、私有化对象

    对象属性

    静态属性

    普通方法

    3、作用

    1)在类的外面不能直接调用类的方法和属性

    2)类的属性值不能随意更改

    3)子类不能通过继承获取父类的私有化属性和方法

    4、实质

    在代码层次做了变形,在类的外部仍可通过  对象名或类命_类命__名字,来调用,不推荐使

    class Person:
        __country = 'china'
    
        def __init__(self, name, sex, age):
            self.__name = name
            self.__sex = sex
            self.__age = age
    
        def get_age(self):
            """
            对象属性__age,私有化无法直接调用
            通过get_age方法实现
            :return: self.__age
            """
            # print(self.__dict__)
            return self.__age
    
        def set_age(self, new_age):
            """
            对象属性__age,私有化无法直接修改
            通过set_age方法实现,并规定属性值只能是数字
            :param new_age:
            :return:赋值类型不符合规定,返回的内容
            """
            if new_age.isdigit():
                self.__age = new_age
            else:
                return '输入错误,请输入年龄'
    
    
    class Worker(Person):
        def __init__(self, name, sex, age, job):
            super().__init__(name, sex, age)
            self.job = job
    
        def test(self):
            print(self.name)
    
    
    w1 = Worker('tom', 'm', '22', 'joker')
    print(w1.test())    # AttributeError: 'Worker' object has no attribute 'name'
    p1 = Person('tom', 'm', '22')
    print(p1.get_age())     # 22
    print(p1.set_age('wt'))     # 输入错误,请输入年龄
    print(p1.get_age())     # 22
    p1.set_age('24')
    print(p1.get_age())     # 24
    print(p1._Person__age)      # 私有化的实质是在代码层次进行变形,格式p1.name-> p1._Person__name, 不推荐使用
    print(Person._Person__country)      # 静态属性私有化,不推荐使用

    二、property

    1、property是内置装饰函数,只在面向对象中使用

    2、作用

    方法属性,给方法加上装饰器,可以在类的外部直接调用方法名而不是调用方法名()

    动词:方法,名词:属性

    from math import pi
    
    
    class Circle:
        def __init__(self, r):
            self.__r = r
    
        @property       # 方法->属性
        def area(self):
            return round(pi * pow(self.__r, 2), 2)
    
    
    c1 = Circle(5)
    print(c1.area)  

    3、修改

    属性私有化,在类的外部不改变该属性的调用方法

    class Phone:
        """
        price私有化
        使用property装饰price方法,在类的外部调用,和没有私有化做比较,不会感到明显的差异
        使用方法名.setter装饰同名方法,来修改
        """
        def __init__(self, name, price):
            self.name = name
            self.__price = price
    
        @property
        def price(self):
            return self.__price
    
        @price.setter
        def price(self, new_price):
            self.__price = new_price
    
    
    red_mi = Phone('mi', 1500)
    print(red_mi.price)     # 1500
    red_mi.price = 2000     # 修改价格
    print(red_mi.price)     # 2000

    3、删除

    不常用

    class Phone:
        """
        price私有化
        使用property装饰price方法,在类的外部调用,和没有私有化做比较,不会感到明显的差异
        使用方法名.setter装饰同名方法,来修改
        """
        def __init__(self, name, price):
            self.name = name
            self.__price = price
    
        @property
        def price(self):
            return self.__price
    
        @price.setter
        def price(self, new_price):
            self.__price = new_price
    
        @price.deleter
        def price(self):
            del self.__price
    
    
    red_mi = Phone('mi', 1500)
    print(red_mi.price)     # 1500
    red_mi.price = 2000     # 修改价格
    print(red_mi.price)     # 2000
    del red_mi.price        # 根据 del 到 price.deleter, 实质是执行price.deleter装饰器下的price方法
    print(red_mi.price)     # 报错,因为已经被删除

    4、总结

    1)property是内置装饰器

    2)查

    私有化属性,可以通过定义同名方法和property装饰器,而不改变在类外部的调用方法

    3)改

    查实现后,才能实现删

    私有化属性,可以通过定义同名方法和property装饰器,而不改变在类外部的调用方法

     通过同方法.setter装饰器,装饰同名方法来修改私有化属性,而不改变在类外部的修改方法

    4)删

    不常用

    三、classmethod

    类方法

    作用:把一个对象方法,变成类方法,调用该方法可以直接通过类,而不需要对象

    格式:有一个默认参数,cls

    什么时候用到:一个方法与私有化静态属性产生联系

    class Student:
        __country = 'china'
    
        def __init__(self, name):
            self.__name = name
    
        @property
        def info(self):
            return '%s is %s' % (self.__name, Student.__country)
    
        @classmethod        # classmethod有一个默认参数,cls
        def con(cls, new_country):
            cls.__country = new_country
    
    
    Student.con('USA')
    s1 = Student('tom')
    print(s1.info)      # tom is USA

    四、staticmethod

    静态方法

    1)作用

    在完全面向对象的程序中,若果一个函数,即和对象没有关系,也和类没有关系,那么就可以用staticmethod装饰该函数,作为类的静态方法

    2)细节

    静态方法在类的内部,在静态方法中可以直接调用类,在类的外部可以通过类名调用静态方法

    class Login:
        def __init__(self, name, pwd):
            self.name = name
            self.pwd = pwd
    
        def login(self):
            if self.name == 'tom' and self.pwd == 'abc-123':
                print('登录成功!')
    
        @staticmethod
        def name_pwd():
            name = input('请输入用户名:')
            pwd = input('请输入密码:')
            Login(name, pwd)        # 在静态方法中可以直接调用类
    
    
    Login.name_pwd()    # 用类调用静态方法

    类方法和静态方法小结

    1、都通过类名调用

    2、类方法有一个默认参数,静态方法没有

    3、类方法:和静态属性有关,通过类直接调用方法,不需要通过对象

    4、静态方法:和类及对象没有关系,但又是必要的方法,python可以不用(面向对象和面向函数),完全面向对象必须用

  • 相关阅读:
    7.9学习日志
    7.8学习日志
    7.7学习日志
    未命名 1
    未命名 1
    未命名 1
    【转】搭建Mac OS X下cocos2d-x的Android开发环境
    【转】如何高效利用GitHub——2013-08-28 22
    【转】GitHub删除一个仓库——2013-08-27 21
    【转】Cocos2d-x 2.x CCSprite 灰白图的生成(利用shader设置)——2013-08-27 21
  • 原文地址:https://www.cnblogs.com/wt7018/p/10933689.html
Copyright © 2011-2022 走看看