zoukankan      html  css  js  c++  java
  • python--面向对象封装

    from collectoins import namedtuple
    Point=namedtuple('point',['x','y'])
    t1=Point(1,2)
    print(t1.x)
    print(t1.y)

    没有方法的类属性不会发生变化
        定义简单
     不能改变
    面向对象封装
    私有属性!!!
    私有方法!!!
    用装饰器描述的几个方法
    @property !!!
    @classmethod!!
    @staticmethod!

    封装

    class Teacher:
         def __init__(self,name,pwd):
          self.name=name
       self.pwd=pwd
    alex=Teacher('alex','3714')
    print(alex.pwd)  #这样不安全

    定义一个私有属性:
        self.__pwd=pwd
     这样pwd就变成了私有属性
    只能自己的类里面用方法用:

        def func(self):
         print(self.__pwd)

       这样在类自己的方法里可以用
    方法也可以私有化
    同样
    可以在实例化的时候直接调用方法,在里面self.方法()
    还有私有静态属性
    如果想要调用的话_类名__方法、静态属性、属性
    只能在内部进行私有属性、私有方法、私有静态属性的定义

    利用私有属性和私有方法进行密码加密:

    class Teacher:
        def __init__(self,name,__pwd):
            self.name=name
            self.__pwd=__pwd
        def __p(self):
            return hash(self.__pwd)
        def oi(self,pwd):
            return hash(pwd)==self.__p()
    so=Teacher('alex',2222)
    ret=so.oi(2221)
    print(ret)

    什么时候会用到私有方法

    1.有一些方法只是用来作为中间结果
    2.父类的方法不希望子类继承
    私有属性用法例子:

    class Person:
        def __init__(self,height,weight):
            self.__height=height
            self.__weight=weight
        def jisuan(self):
            return  self.__weight/(self.__height*self.__height)
        def change(self,new,neww):
            if neww >20:
                self.__weight=neww
                self.__height=new
            else:
                print('体重过轻')
    jing=Person(1.70,52)
    print(jing.jisuan())
    jing.change(1.65,42)

    @property  把一个方法伪装成属性,直接加在方法上面,调用的时候就是属性了

    class Fang:
        def __init__(self,name,chang,kuan):
            self.name=name
            self.__chang=chang
            self.__kuan =kuan
        @property
        def get_1(self):
            return self.name,self.__chang*self.__kuan
    jing=Fang('jing',55,22)
    print(jing.get_1)

    @方法名.setter  修改函数伪装成的属性的值
    def 方法名(self,zhi):
         self.变量名=zhi 

    私有方法是不可以被子类继承的

    方法@staticmethod
    类里面的方法就可以不传参数了
    不能将函数独立的放在类外面  完全使用面向对象编程的时候
    并且这个函数完全不需要依赖对象的属性和类的属性
    就可以用staticmethod装饰这个函数
    静态方法:没有必须传的参数 方法不需要用对象的属性和类的属性
    普通方法:必须穿一个对象 可以使用对象的属性和类的属性
    类方法:必须传一个类,方法不需要使用对象的属性,但可以使用类的属性
    @classmethod   里面传cls

  • 相关阅读:
    luogu P2852 [USACO06DEC]Milk Patterns G
    FZOJ 4267 树上统计
    CF1303G Sum of Prefix Sums
    luogu P5311 [Ynoi2011]成都七中
    luogu P5306 [COCI2019] Transport
    SP34096 DIVCNTK
    luogu P5325 【模板】Min_25筛
    luogu P1742 最小圆覆盖
    求两直线交点坐标
    1098: 复合函数求值(函数专题)
  • 原文地址:https://www.cnblogs.com/gaoshengyue/p/7562521.html
Copyright © 2011-2022 走看看