python学习13类2之封装

‘‘‘‘‘‘‘‘‘面向对象三大特性:封装,继承,多态1.封装: 类中以_或者__的属性,都是私有属性,禁止外部调用。‘‘‘class Student(object):

    def __init__(self,name,age,sex):        self.__name = name        self.__age = age        self.__sex = sex

one = Student(‘wsx‘,18,‘男‘)

print(one._Student__name)print(one._Student__age)print(one._Student__sex)

one._Student__age = 20print(one._Student__age)

#print(one.__name)       # 报错,__name被私有化,封装起来了,所以外界无法访问,找不到该属性#print(one.name)         # 报错,无该属性‘‘‘上述封装方式,调用起来比较麻烦。现在我将name,age,sex设置为私有属性,但是我又想让他们通过我指定的接口去访问或者修改我的属性,应该如何实现了?‘‘‘class Student1(object):

    def __init__(self,name,age,sex):        self.__name = name        self.__age = age        self.__sex = sex

    def get_name(self):        return self.__name  #这种方式是在类的内部,所以我们可以通过.__name的方式获得该属性

    def set_name(self,name):        if len(name) > 1 :            self.__name = name        else:            print("name的长度必须要大于1个长度")

    def get_age(self):        return self.__age

    def set_age(self, age):        if age > 0 and age < 150:            self.__age = age        else:            print("输入的年龄必须要大于0,小于150岁")

two = Student1(‘wsx‘,18,‘男‘)

two.set_name(‘a‘)       # 通过自己设置接口,可以有效规避脏数据print(two.get_name())       # 通过接口获取数据

two.set_age(20)         # 通过自己设置接口,可以有效规避脏数据print(two.get_age())    # 通过接口获取数据‘‘‘这样我们就自定义了自己属性的接口,它的好处在于:规避脏数据问题:使用接口设置获取数据 和 使用点方法(one.name = 18 或者print(one.name))设置数据相比, 点方法使用更方便,我们有什么方法达到 既能使用点方法,同时又能让点方法直接调用到我们的接口了? ‘‘‘class Student2(object):

    def __init__(self,name,age,sex):        self.__name = name        self.__age = age        self.__sex = sex

    @property    def name(self):        return self.__name

    @name.setter    def name(self,name):        if len(name) > 1 :            self.__name = name        else:            print("name的长度必须要大于1个长度")

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

    @age.setter    def age(self, age):        if age > 0 and age < 150:            self.__age = age        else:            print("输入的年龄必须要大于0,小于150岁")

three = Student2(‘wsx‘,18,‘男‘)

three.name = ‘ly‘print(three.name)

three.age = 170print(three.age)

‘‘‘@property:装饰器:负责把一个方法变成属性来调用@属性名.setter:要把一个方法变成属性,只需要在get方法上加上@property,此时@property自身又创建了另一个装饰器,@属性名.setter,用于对属性值的赋值‘‘‘

原文地址:https://www.cnblogs.com/wsxcode/p/12362454.html

时间: 2024-08-04 09:19:24

python学习13类2之封装的相关文章

ffmpeg学习4--ffmpeg类的简单封装,包含解码和定时录像功能

ffmpeg学习4--ffmpeg类的简单封装,包含解码和定时录像功能 参考网上的资料,简单封装了一下ffmpeg,这里记录一下,其它传感器编码及项目中用到的已经抽离,这里只包含解码和录像部分.这只是个玩具级别的测试.完整测试代码下载:代码下载 ffmpegDeCode.h #pragma once #include "stdafx.h" #include<iostream> using namespace std; extern char *VideoPath; exte

Python学习(七)面向对象 ——封装

Python 类的封装 承接上一节,学了Student类的定义及实例化,每个实例都拥有各自的name和score.现在若需要打印一个学生的成绩,就可定义函数 print_score() 该函数为类外的函数,如下: 1 class Student: 2 def __init__(self, name, score): 3 self.name = name 4 self.score = score 5 6 May = Student("May",90) # 实例化 7 Peter = St

python学习19类5之多态与鸭子模型

'''''''''一.多态1.Python中多态是指一类事物有多种形态.''' class Animal: def run(self): raise AttributeError('子类必须实现这个方法') #抛出异常 class People(Animal): def run(self): print('人正在走') class Pig(Animal): def run(self): print('pig is walking') class Dog(Animal): def run(self

python学习——定制类

看到类似__slots__这种形如__xxx__的变量或者函数名就要注意,这些在Python中是有特殊用途的. __slots__我们已经知道怎么用了,__len__()方法我们也知道是为了能让class作用于len()函数. 除此之外,Python的class中还有许多这样有特殊用途的函数,可以帮助我们定制类. __str__ 我们先定义一个Student类,打印一个实例: >>> class Student(object): ... def __init__(self, name):

Python学习(类属性与实例属性)

编程语言都围绕着实例(对象),函数关系,及作用域展开(对象的生命周期) Python的import sys或者其它类似于c语言编译时的链接过程,不在同一个文件中的函数关系,我们怎样才能利用到它 Python的类跟c++的类基本是同一个东西,Python没有protected的权限,只有private和public,感觉友好很多 实例属性与c++的普通成员相同,类属性则类似于静态成员(static变量),初始化一次,通过类名访问和修改,所有的实例维护类的同一份的static成员变量 __init_

python学习笔记-类的descriptor

descriptor应用背景 所谓描述器,是实现了描述符协议,即get, set, 和 delete方法的对象. 简单说,描述符就是可以重复使用的属性. 比如以下代码: f = Foo() b = f.bar f.bar = c del f.bar 在解释器执行上述代码时,当发现你试图访问属性(b = f.bar).对属性赋值(f.bar = c)或者删除一个实例变量的属性(del f.bar)时,就会去调用自定义的方法. 为什么把对函数的调用伪装成对属性的访问?有什么好处? 从property

python学习之 类class

定义 Python 的 Class 比较特别,和我们习惯的静态语言类型定义有很大区别. 1. 使用一个名为 __init__ 的方法来完成初始化.2. 使用一个名为 __del__ 的方法来完成类似析购操作.3. 所有的实例方法都拥有一个 self 参数来传递当前实例,类似于 this.4. 可以使用 __class__ 来访问类型成员 >>>>>> class MyClass: def __init__(self): print "initialize.&q

Python学习_11_类和实例

类和实例 类是对象创建实例的模板,而实例则是对象的实体.类使用class关键字定义: class MyClass:? ? pass python中创建实例直接使用工厂函数(类名加上一对括号),和其他的语言使用new关键字有所不同: my_obj = MyClass() 一般来说,类名以大写字母开头,而对象名则以小写字母或者下划线开头. 实例化对象时,会执行类定义中的__init__()方法,该方法执行时包含实例的各种初始化操作. 方法和函数的区别:方法由对象调用,在方法定义中,第一个参数必须是显

Python学习-13.Python的输入输出(二)

在Python中,读取文件使用open函数 1 file=open(r'E:\temp\test.txt','r') 2 var = file.read() 3 print(var) 4 file.close() 第一行打开E:\temp\test.txt文件,注意字符串开头使用了r,r表明字符串内的内容不转义,像C#中的@.在Python中,如果要让字符串不转义,则在字符串开头加上r或R即可.第二个参数表明只读文件. 'r' 只读 'w' 只写 'a' 追加 'b' 二进制 'r+','a+'