python进阶之面向对象初识
面向对象
不同于面向过程的编程思想,面向对象是一种将程序抽象为一个个对象的编程思想,能更好的处理现实世界到的一些复杂问题。
通过下面的例子来初步了解面向对象的编程方式。
class Person: # class + 类名 :定义一个类
place = 'earth' # 类属性 (静态属性) # __init__初始化方法,默认创建一个self对象,用来接收对象的属性。可以没有初始化方法
def __init__(self, name, sex, age, nationality): # self必须有,其他的参数以对象具有的属性来定义
self.name = name # 实例化属性
self.sex = sex
self.age = age
self.nationality = nationality def walk(self): # 方法即函数 (动态属性),定义这一类对象所能做的事情。self必须有
print('%s行走' % self.name) zxc = Person('张三', '男', 24, '中国') # 对象 = 类名(实例化属性) -- 实例化:创建了一个具体的对象
print(zxc.name) # 张三 查看对象的属性
print(Person.place) # earth 查看类的属性
print(zxc.__dict__) # 查看对象的全部属性 是个字典
print(Person.__dict__) # 查看类的全部属性 是个字典
zxc.name = '李四' # 修改属性
zxc.walk() # 李四行走 使用方法 相当于Person.walk(zxc)
通过上面的例子简单总结一下
"""
类:用来描述一类具有相同属性和方法的对象的集合
实例化:对象 = 类名()
对象:1,可以查看属性 2,修改属性 3,调用方法
类:1,实例化 2,调用方法,但是要自己传self参数 3,查看和修改类属性
"""
下面了解一下类和对象的命名空间,先定义一个类,在实例化两个对象做对比。
class Demo:
class_nature = '静态属性'
class_nature1 = ['静态属性'] def __init__(self, object_nature):
self.nature = object_nature def dynamic_nature(self):
print('动态属性') d = Demo('实例化属性')
d1 = Demo('实例化属性1')
先研究下类
# 类只能调用类属性和动态属性即在类的命名空间中的名字
print(Demo.class_nature)
# print(Demo.nature) # 报错 类不能访问对象命名空间中的名字
在看下对象
# 对象可以访问类命名空间中的名字
print(d.class_nature) # 静态属性
d.dynamic_nature() # 动态属性
可以看到对象可以访问类的命名空间中的名字,进而看看是否可以通过对象对类属性进行修改。
# 当属性是不可变数据类型,对象不能修改类命名空间中的名字,所有的修改相当于在对象自己内部创建了一个新的属性
Demo.class_nature = '类属性修改'
d.class_nature = 'd类属性修改'
d1.class_nature = 'd1类属性修改'
print(Demo.class_nature) # 类属性修改
print(d.class_nature) # d类属性修改
print(d1.class_nature) # d1类属性修改
在看可变数据类型
# 当属性是可变数据类型,对象可以修改类属性里面的元素,且修改会作用于全部的对象。但是类属性本身还是不能修改
print(Demo.class_nature1) # ['静态属性']
d.class_nature1[0] = 'd修改'
d.class_nature1 = ['修改']
print(d.class_nature1) # ['修改']
print(Demo.class_nature1) # ['d修改']
print(d.class_nature1) # ['修改']
print(d1.class_nature1) # ['d修改']
类的组合使用:一个对象的属性值是另外一个类的对象
下面来个例子感受一下
class Teacher:
def __init__(self,name, age, birthday):
self.name = name
self.age = age
self.birthday = birthday # 接收Birthday类的对象,从而通过Teacher类的对象就可以操作Birthday类 class Birthday:
def __init__(self, year, month, day):
self.year = year
self.month = month
self.day = day birth = Birthday(1992, 12, 23)
teacher = Teacher('张老师', 26, birth)
print(teacher.birthday.year) #
print(teacher.birthday.month) #
print(teacher.birthday.day) #
python进阶之面向对象初识的更多相关文章
- python进阶01 面向对象、类、实例、属性封装、实例方法
python进阶01 面向对象.类.实例.属性封装.实例方法 一.面向对象 1.什么是对象 #一切皆对象,可以简单地将“对象”理解为“某个东西” #“对象”之所以称之为对象,是因为它具有属于它自己的“ ...
- Python进阶(十三)----面向对象
Python进阶(十三)----面向对象 一丶面向过程编程vs函数式编程vs面向对象编程 面向过程: 简而言之,step by step 一步一步完成功能,就是分析出解决问题所需要的步骤,然后用函 ...
- Python进阶之面向对象编程
面向对象编程——Object Oriented Programming,简称OOP,是一种程序设计思想.OOP把对象作为程序的基本单元,一个对象包含了数据和操作数据的函数. 面向过程的程序设计把计算机 ...
- python递归 及 面向对象初识及编程思想
递归 及 面向对象初识及编程思想 一.递归 1.定义: 在函数内部,可以调用其他函数.如果一个函数在内部调用自身本身,这个函数就是递归函数. (1)递归就是在过程或函数里调用自身: (2)在使用递 ...
- Python进阶之面向对象编程(二)
Python面向对象编程(二) .note-content {font-family: "Helvetica Neue",Arial,"Hiragino Sans GB& ...
- Python进阶之面向对象编程概述
Python面向对象编程(一) .note-content {font-family: "Helvetica Neue",Arial,"Hiragino Sans GB& ...
- python记录_day15 面向对象初识
一.面向过程和面向对象 1.面向过程 以我为中心,做一件事先干什么,在干什么,后干什么,有一套清楚完整的流程.核心是“过程”. 优点:将要解决的问题流程化, 编写相对简单 缺点:可扩展性差 2.面向对 ...
- Python进阶-XIV 面向对象初步
1.面向对象的引入 def Person(*args): ''' 定义一个人 :param args: 人的属性 :return: 人的所有属性的字典 ''' info = {} info['name ...
- Python 进阶_OOP 面向对象编程_组合与继承
#目录 前言 组合 派生 通过继承来覆盖重载方法 最常用的重载场景实例方法的重载 从标准类中派生类方法的重载 前言 我们定义一个类是希望能够把类当成模块来使用,并把类嵌入到我们的应用代码中,与其他的数 ...
随机推荐
- Loadrunner常用分析点
Loadrunner常用的分析点 一.在Vuser(虚拟用户状态)中 1.Running Vusers:提供了生产负载的虚拟用户运行状态的相关信息,可以帮助我们了解负载生成的结果.(即用户在几分钟左右 ...
- ubuntu更新问题
ubuntu 下出现E: Sub-process /usr/bin/dpkg returned an error code 在用apt-get安装软件时出现了类似于install-info: No d ...
- NodeJS基础之Express路由和中间件
路由 路由是指如何定义应用的端点(URIs)以及如何响应客户端的请求. 路由是由一个 URI.HTTP 请求(GET.POST等)和若干个句柄组成,它的结构如下: app.method(path, [ ...
- C++中delete this
Is it legal (and moral) for a member function to say delete this? As long as you’re careful, it’s ok ...
- Java练习 SDUT-1160_某年某月的天数
C语言实验--某年某月的天数 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 输入年和月,判断该月有几天? Input ...
- HZOJ 导弹袭击
比较显然的一个性质是如果存在$a(i)>=a(j) \& \& b(i)>=b(j)$那么j没用. 我们并不需要A,B的具体取值,我们之关心$\frac {A}{B}$. ...
- 【C++】STL :栈
c++stack(堆栈)是一个容器的改编,它实现了一个先进后出的数据结构(FILO) 使用该容器时需要包含#include<stack>头文件: 定义stack对象的示例代码如下: sta ...
- Java面向对象----继承概念,super关键字
继承概念: 继承需要符合的关系 is-a , 父类通用更抽象,子类更特殊更具体 类之间的关系 继承体现 组合体现 实现接口体现 继承的意义 代码重用 体现不同抽象层次 extends关键字 Sup ...
- asp.net抓取网页html源代码失败 只因UserAgent作怪
asp.net抓取网页html源代码,我想对于任何一个asp.net程序员来说都不再陌生,这是一个非常简单容易就能实现的功能.下面便是一个通用的asp.net获得网页源代码的程序. 首先引用 usin ...
- LInux下编译发生的libc相关错误
在某主机上编译程序,发生有找不到libc的问题,自己写了个简单的hello world程序,编译也失败,报错如下: # gcc -o 1 1.c /usr/bin/ld: skipping incom ...