ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

Day04 python 面向对象编程基础

2019-08-19 19:42:22  阅读:172  来源: 互联网

标签:__ 函数 python self Day04 对象 面向对象编程 age def


Day04 面向对象编程基础

学习目标

  • 描述对象和类
  • 定义带数据域和方法的类
  • 使用构造方法调用初始化来创建和初始化数据域以构建一个对象
  • 使用self参数引用对象本身

面向对象思想有三大要素:封装、继承和多态
为了简化程序的设计,我们引入了函数的概念,把相对独立且经常重复使用的代码放置到函数中,在需要使用这些功能的时候只要调用函数即可;如果一个函数的功能过于复杂和臃肿,我们又可以进一步将函数继续切分为子函数来降低系统的复杂性。
类和对象
类和对象
简单的说,类是对象的蓝图和模板,而对象是类的实例。这个解释虽然有点像用概念在解释概念,但是从这句话我们至少可以看出,类是抽象的概念,而对象是具体的东西。在面向对象编程的世界中,一切皆为对象,对象都有属性和行为,每个对象都是独一无二的,而且对象一定属于某个类(型)。当我们把一大堆拥有共同特征的对象的静态特征(属性)和动态特征(行为)都抽取出来后,就可以定义出一个叫做“类”的东西。
为对象定义类
关键点:类定义对象的特征和行为

  • 一个对象的特性就像人的身份证号码,Python会在运行时自动对每一个对象赋予一个独特的id来辨识这个对象
  • 一个对象的特征和属性是用变量表示的,被称之为数据域
  • 方法也被称为函数,通过调用对象上的方法可以让对象完成某个动作,python使用方法来定义一个对象的行为
  • 对象就是累的一个实例
    定义类
    在Python中可以使用class关键字定义类,然后在类中通过之前学习过的函数来定义方法,这样就可以将对象的动态特征描述出来
    定义一个类
    以上实例定义了一个类,类名通常实在关键词class后,其后紧随一个冒号(:),初始化程序总是被命名为 _ _ init _ _,这个方法被称为初始化程序,它是在创建和初始化这个新对象时被调用的。
    下面示例一个小程序
    #打印进度条
import time
class Zcz(object):
	def __init__(self):
		self.count = 1
	def jindutiao(self):
		for i in range(0,100):
			time.sleep(0.1)
			if i % 5 == 0:
				res = '#'*self.count
				print('%s %d%%'%(res,(i+5)))
				self.count += 1
if __name__ == '__main__':
	zcz = Zcz()
	zcz.jindutiao()

构造对象完成两个任务:

  • 在内存中为类创建一个对象
  • 调用类的 _ _ init _ _方法来初始化对象
    构造方法的语法规则是:类名(参数)参数self
    访问可见性问题
    对象成员是指它的数据域和方法。数据域也被称为实例变量,因为每个对象(实例)的数据域都有一个特定值。方法也被称为实例变量,因为方法被一个对象(实例)调用来完成对象上的动作

私有变量,变量名前面加"_ _"

如果非要使用私有变量,那么可以使用dir(class())去查看它真正的名字.
私有变量/函数,在类内部可以直接调用.
如果你想体现一个变量/函数特别重要你可以使用"_"

class Test:

    def __init__(self, foo):
        self.__foo = foo

    def __bar(self):
        print(self.__foo)
        print('__bar')


def main():
    test = Test('hello')
    # AttributeError: 'Test' object has no attribute '__bar'
    test.__bar()
    # AttributeError: 'Test' object has no attribute '__foo'
    print(test.__foo)


if __name__ == "__main__":
    main()

Python并没有从语法上严格保证私有属性或方法的私密性,它只是给私有的属性和方法换了一个名字来“妨碍”对它们的访问
不变对象和可变对象
当将一个可变对象传给函数时,函数可能会改变这个对象的内容
python中的数字和字符串都是不可变的对象。他们的内容不能被改变。当将一个不可变对象传给函数时,对象不会被改变。但是,如果你给函数传递一个可变对象,那么对象的内容就可能有变化。以下示例演示不可变对象和不可变对象参数在函数中的不同
在这里插入图片描述
当你将一个对象传递给函数,就是将这个对象的引用传递给函数。但是传递不可变对象和可变对象之间还有更重要的区别。

  • 像数字或者字符串这样的不可变对象参数,函数外的对象的原始值并没有被改变
  • 如果是可变对象参数,如果对象的内容在函数内被改变,则对象的原始值被改变
    隐藏数据域
    作用就是使数据域私有来保护数据,让类更易于维护
    私有数据域和方法可以在类内部被访问,但它们不能再类外被访问。为了让客户端访问数据域,就要提供一个get方法返回它的值。为了使数据域可以被更改,就要提供一个set方法去设置一个新值。
    通俗来讲,get方法就是指获取器(或访问器),set方法就是指设置器(或修改器)
    在这里插入图片描述
class Person(object):

    def __init__(self, name, age):
        self._name = name
        self._age = age

    # 访问器 - getter方法
    @property
    def name(self):
        return self._name

    # 访问器 - getter方法
    @property
    def age(self):
        return self._age

    # 修改器 - setter方法
    @age.setter
    def age(self, age):
        self._age = age

    def play(self):
        if self._age <= 16:
            print('%s正在玩飞行棋.' % self._name)
        else:
            print('%s正在玩斗地主.' % self._name)


def main():
    person = Person('王大锤', 12)
    person.play()
    person.age = 22
    person.play()
    # person.name = '白元芳'  # AttributeError: can't set attribute


if __name__ == '__main__':
    main()

继承
子类构造函数基础父类构造函数过程如下:

实例化对象c ----> c 调用子类__init__() ---- > 子类__init__()继承父类__init__() ----- > 调用父类 init()
在这里插入图片描述

你现在偷的懒都是以后给自己挖的坑!既来之则安之!加油照哥

标签:__,函数,python,self,Day04,对象,面向对象编程,age,def
来源: https://blog.csdn.net/weixin_43790072/article/details/99737012

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有