python学习_day26_面向对象之封装

1、私有属性

(1)动态属性

  在python中用双下划线开头的方式将属性隐藏起来。类中所有双下划线开头的名称,如__x都会自动变形成:_类名__x的形式。这种自动变形的特点是:

  a.类中定义的__x只能在内部使用,如self.__x,引用的就是变形的结果。b.这种变形其实正是针对外部的变形,在外部是无法通过__x这个名字访问到的。c.在子类定义的__x不会覆盖在父类定义的__x,因为子类中变形成了:_子类名__x,而父类中变形成了:_父类名__x,即双下滑线开头的属性在继承给子类时,子类是无法覆盖的。

class Teacher:
    def __init__(self,name,pswd):
        self.name=name
        self.__pswd=pswd                                       #私有属性
    def func(self):
        print(self.__pswd)
alex=Teacher(‘alex‘,‘3714‘)
alex.func()
# print(alex.__pswd)                                           #私有属性不可以通过此方式查看
print(alex._Teacher__pswd)                                     #私有属性外部查看的方式:_Teacher__pswd储存

(2)静态属性

  私有化的方式同样为在属性名前加双下划线,只能在内部进行使用,外部查看方式与动态属性一样。

class Teacher:
    __identifier=‘teacher‘                                     #私有静态属性
    def __init__(self,name,pwd):
        self.name=name
        self.__pwd=pwd                                         #私有属性
    def func(self):
        print(self.__pwd,Teacher.__identifier)
print(Teacher._Teacher__identifier)                            #在外面查看静态属性方法
alex=Teacher(‘alex‘,‘1234‘)
alex.__a=‘aaa‘                                                 #在外部定义,并不会形成私有化,__a即为一个合法的正常变量名
print(alex.__dict__)                                           #查看动态属性字典,结果为:{‘name‘: ‘alex‘, ‘_Teacher__pwd‘: ‘1234‘, ‘__a‘: ‘aaa‘}

问题点总结:

  (a).这种机制也并没有真正意义上限制我们从外部直接访问属性,知道了类名和属性名就可以拼出名字:_类名__属性,然后就可以访问了,如a._A__N。

  (b).“__属性”变形到“_类名__属性”只在类的内部生效,在定义后的进行的近似私有化赋值操作,不会变形,为正常的赋值过程。

2、私有方法

  私有化方法也只能在类的内部进行进行使用,有一些方法的返回值只是用来作为中间结果,可以进行私有化,如下例:

class Teacher:
    def __init__(self,name,pwd):
        self.name=name
        self.__pwd=pwd                                    #私有属性
    def __func(self):                                     #私有方法
        return hash(self.__pwd)
    def login(self,password):
        return hash(password)==self.__func()

alex=Teacher(‘alex‘,‘1234‘)
ret=alex.login(‘2234‘)
print(ret)                                                #输出结果为:False    

  在继承中,父类如果不想让子类覆盖自己的方法,可以将方法定义为私有的。

class Foo:
    def __jinghong_sb(self):                             #变形为:_Foo__jinghong_sb
        print(‘Foo‘)
class Son(Foo):
    def __jinghong_sb(self):                             #变形为:_Son__jinghong_sb
        print(‘Son‘)
    def func(self):
        self.__jinghong_sb()                             #变形为:_Son__jinghong_sb,

son = Son()
son.func()                                               #结果为:son

3、property方法

  实现类中的方法时,以查看类的属性的方式进行,即将类中的方法看起来像属性而不是方法。如下例:

#例1:class Person:
    def __init__(self,name,height,weight):
        self.name = name
        self.__height = height
        self.__weight = weight

    @property
    def bmi(self):
        return self.__weight / (self.__height**2)

jinghong = Person(‘景弘‘,1.8,94)
print(jinghong.name,jinghong.bmi)                     #输出结果:景弘 29.012345679012345

 

#例2:
import math
class Circle:
    def __init__(self,radius):
        self.radius=radius

    @property
    def area(self):
        return math.pi * self.radius**2               #计算面积

    @property
    def perimeter(self):
        return 2*math.pi*self.radius                  #计算周长

c=Circle(10)
print(c.radius)
print(c.area)                                         #可以向访问数据属性一样去访问area,会触发一个函数的执行,动态计算出一个值
print(c.perimeter)                                    #可以向访问数据属性一样去访问area,会触发一个函数的执行,动态计算出一个值

  将一个类的函数定义成特性以后,对象再去使用的时候obj.name,根本无法察觉自己的name是执行了一个函数然后计算出来的,这种特性的使用方式遵循了统一访问的原则。以上不可以通过赋值对jinghong.bmi、c.area、c.perimeter进行更改。一个静态属性property本质就是实现了get,set,delete三种方法,具体实例如下:

class Shop:
    discount = 0.75
    def __init__(self,name,price):
        self.name = name
        self.__price = price
    @property
    def price(self):
        return self.__price * Shop.discount
    @price.setter
    def price(self,new_price):
        self.__price = new_price
    @price.deleter
    def price(self):
        del self.__price

apple = Shop(‘apple‘,5)
print(apple.price)                                   #获取商品价格
print(apple.__dict__)                                #输出结果:{‘name‘: ‘apple‘, ‘_Shop__price‘: 5}
apple.price = 6                                      #修改商品原价
print(apple.price)
print(apple.__dict__)                                #输出结果:{‘name‘: ‘apple‘, ‘_Shop__price‘: 6}
del apple.price                                      #删除商品原价
print(apple.__dict__)                                #输出结果:{‘name‘: ‘apple‘}
  注意:只有在属性AAA定义property后才能定义AAA.setter,AAA.deleter,如上例且各属性方法名需一样,均为price。4、classmethod和staticmethod  (1)普通方法:必须传一个对象 可以使用对象的属性和类的属性
class A:
    def __init__(self,name):
        self.name = name

    def func(self):                                 #普通方法,self为形式参数
        print( self.name)
  (2)类方法(classmethod):必须传一个类,方法不需要使用对象的属性,但可以使用类的属性
class A:
    role = ‘a‘
    @classmethod
    def class_method(cls):                          #类方法,cls代表类
        print(cls.role)
A.class_method()                                    #输出结果:a类名.方法名()调用

  (3)静态方法(staticmethod):没有必须传的参数,方法不需要用对象的属性和类的属性

class Staticmethod_Demo():
    role = ‘dog‘
    @staticmethod
    def func():                                   #静态方法,不需要参数
        print("a")
Staticmethod_Demo.func()                          #调用方式:类名.方法名()
  使用情况:不能将函数独立的放在类外面 完全使用面向对象编程的时候,并且这个函数完全不需要依赖对象的属性和类的属性, 就可以用staticmethod装饰这个函数。
 
 
 
 
时间: 2024-10-08 05:05:12

python学习_day26_面向对象之封装的相关文章

python学习之面向对象高级特性

类属性与实例属性类属性就是类对象所拥有的属性,它被所有类对象的实例对象所共有,在内存中只存在一个副本.在前面的例子中我们接触到的就是实例属性(对象属性),它不被所有类对象的实例对象所共有,在内存中的副本个数取决于对象个数. 05_类属性鱼实例属性.py import random class Turtle(object): # power是类属性. power = 100 def __init__(self): # x,y:实例属性. self.x = random.randint(0, 10)

Python学习笔记-面向对象

一.什么是面向对象的程序设计 1.面向过程的程序设计 面向过程:核心是过程二字,过程即解决问题的步骤,就是先干什么,再干什么.基于该思想写程序就好比在设计一条流水线,是一种机械式的思维方式. 优点:复杂的过程流程化,进而简单化 缺点:扩展性差 2.面向对象的程序设计 面向对象:核心是对象二字,对象是特征与技能的结合体.基于该思想编写程序就好比在创造一个世界,世界是由一个个对象组成,是一种"上帝式"的思维方式 优点:可扩展性强 缺点:编程复杂度高,容易出现过度设计问题 二.类与对象 对象

Python学习笔记-面向对象进阶(一)封装、多态、继承

一.初识继承 1.什么是继承? 继承是一种创建新类的方式,新建的类可以继承一个或多个父类(python支持多继承),父类又可称为基类或超类,新建的类称为派生类或子类.子类会"遗传"父类的属性,从而解决代码重用问题. # python中类的继承分为:单继承和多继承 class ParentClass1: #定义父类 pass class ParentClass2: #定义父类 pass class SubClass1(ParentClass1): #单继承,基类是ParentClass1

【Python学习之旅】---封装与反射(类的相关知识,面向对象三大特性:继承-多态-封装)

#第一层封装:定义类#第二层封装:区分内外,有些属性只能内部使用,外部不能 class Name: __a='你是猪' #封装变量a def __init__(self,name): self.name=name def get_name(self): print('我叫%s' %self.name) n1=Name('陈宇霞')print(Name.__dict__) #查看类属性字典print(n1._Name__a) #可以通过此种方式调用__a ,没有真正的封装 #真正的封装:区分内外,

Python 学习笔记 - 面向对象(类成员)

上一篇学习了Python面向对象的3大特性,封装,继承和多态,这一篇继续学习类成员,包括字段,方法,属性以及他们的修饰符. 1.字段 字段分为静态字段和普通字段.静态字段属于类,而普通字段属于对象,因此静态字段在内存中只保存一份,而普通字段在每个对象中都保存了一份.定义的时候静态字段定义在类的范围里面,而普通字段定义在方法里面. 例如: >>> class Foo:     # 字段(静态字段)     CC = 123     def __init__(self):         #

Python 学习笔记 - 面向对象(基础)

之前学习的编程方式都是通过面向过程来实现的,对于一些重用的代码,进一步的使用了函数,增强了代码的可读性和重用性.Python同时还支持面向对象的编程. 面向对象有三大特性: 封装 继承 多态 首先来看看封装.封装包括两点,把内容封装到某个地方:调用封装的内容 例1: class c1:     def __init__(self,name,obj):         self.name = name         self.obj = obj class c2:     def __init_

Python学习8——面向对象

写在开头: 这部分学习总结本来应该是抽象的延续,但是我却不想用“抽象2”来给标题命名,我觉得这节的内容更适合称为“面向对象”. 下面是跟随<Python基础教程>(第3版)第7章来学习的. 创建自定义对象是Python的核心概念,Python可以同java语言一样,被视为是一种面向对象语言.在面向对象编程中,术语对象大致意味着一系列访问和操作这些数据的方法. 有一点java基础的同学应该都了解,面向对象的3个基本特征:封装,继承,多态. 多态:可对不同类型的对象执行相同的操作,而这些操作就像“

Python学习:面向对象(OOP)

类和实例 1.类(class):有属性有方法就是类.下面是Student类: class Student(object):     def __init__(self, name, score):         self.name = name         self.score = score     def print_score(self):         print('%s: %s'%(self.name,self.score))     def get_grade(self):

python学习总结(面向对象进阶)

-------------------类属性和实例属性关系------------------- 1.类属性和实例属性关系 1.实例属性 实例对象独有的属性 2.类属性 类名访问类属性 3.实例中无同名属性时,可访问到类属性,当定义同名实例属性时,则无法访问 4.常用的查找指令 1.vars :查看实例内属性 2.dir :显示类属性和所有实例属性 3.type :显示类型 -------------------方法------------------- 1.实例方法 隐含的参数为类实例self