Python面向对象学习2(面向对象的语法和特性,待更新)
上一个内容我们介绍了面向对象和面向对象场景现在我们来学习下语法和特性
1,面向对象基本语法:
# -*- coding:utf-8 -*-
# Author: Colin Yao
class Dog(object): #类
def __init__(self,name):#构造函数、构造方法 ==初始化方法
self.NAME = name
def sayhi(self): #类的方法
print("hello, i am a dog. my name is ",self.NAME)
def food(self,food):
print('%s is eat %s' %(self.NAME,food)) #函数注重过程、函数是模板、需要实例化
d = Dog("A") #实例 #,Dog(d,"Alex") 实例化后缠上的对象、叫实例(当前Dog类的实例) self = d self就是实例本身
d2 = Dog("lin")
# d.sayhi() #调用类
d.food(food='gouliang')
__init__()叫做初始化方法(或构造方法), 在类被调用时,这个方法(虽然它是函数形式,但在类中就不叫函数了,叫方法)会自动执行,进行一些初始化的动作,所以我们这里写的__init__(self,name)就是要在创建一个角色时给它设置这些属性,那么这第一个参数self,就是实例本身!你实例化时python会自动把这个实例本身通过self参数传进去
涉及的知识和解释:
1.类,class Dog(object)#(新式类我们后面讲一下),Py3建议这样的语法,并且首字母要大写
2.构造函数,def __init__(self,name): 构造函数,构造方法,也相当于初始化方法
3.类的方法,def sayhi(self):
4.实例:d = Dog("A") 相当于Dog(d,"A") 传进了,构造函数:def __init__(self,name) , self =d , name = A ,self.NAME=name 相当于d.NAME = name 也就是等于A
5. 在调用方法food方法的时候,d.food(food='gouliang'),相当于将d.food(d,"gouliang")传进了def food(self,food),最后 print('%s is eat %s' %(self.NAME,food)) 就是print A is eat gouliang,self.NAME = d.NAME = A
2,面向对象的特性:
封装,封装是把一个对象的属性私有化不让外界调用,也提供一些可以被外界访问的属性的方法。
封装语法
class Role(object):
nationlity = 'CN' #公有属性
def __init__(self, name, role, weapon, life_value=100, money=15000):
self.name = name #成员属性
self.role = role
self.weapon = weapon
self.life_value = life_value
self.money = money
self.__heart = "Nomal" #私有属性一般不能直接被实例调用
def shot(self):
print("%s shooting..." %self.name)
self.__heart = "Die"
print(self.__heart) def get_heart(self):
return self.__heart
r1 = Role('Alex', 'police', 'AK47') #生成一个角色
r2 = Role('Jack', 'terrorist', 'B22') #生成一个角色
r3 = Role('lichuang','警犬','B13')
print("如果你想访问私有属性、不能修改、就需要添加代码def get_heart(self):return self.__heart----->私有属性为:",r1.get_heart()) #
print(r1.nationlity,'相当与在成员属性里添加了nationlity') #公有属性在类里直接定义的
私有属性: self.__heart = "Nomal" (正常情况是不可以访问到私有属性的,这里写了一段,def get_heart(self): return 就可以访问了)
共有属性: class Role(object):;nationlity = 'CN'
成员属性: self.name = name...
继承,继承是使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展,继承的过程就是一般到特殊的过程,同一类对象有父类子类分别继承,实现继承可以通过继承和组合来实现
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# Author: Colin Yao
class Person(object): #父类
def __init__(self,name,age):
self.name = name #self = b self.name =b.name
self.age = age
self.sex = "noraml"
def talk(self):
print("persion is talking") class BlackPerson(Person):#子类
def __init__(self,name,age,strength):#这时候如果重新写就会覆盖父类的方法、所以我门需要先继承,在重构
Person.__init__(self,name,age) #调用还没有实例化的类,self 传的是BlackPerson的类
self.strength = strength
# print(self.name,self.age,self.sex)
def talk(self):
print("Black person is blaba....") def walk(self):
print("is walking") class WhitePerson(Person):
pass b = BlackPerson("Weiersmith","","strong")
b.talk()
在python中继承中的一些特点:
1:在继承中基类的构造(__init__()方法)不会被自动调用,它需要在其派生类的构造中亲自专门调用。有别于C#
2:在调用基类的方法时,需要加上基类的类名前缀,且需要带上self参数变量。区别于在类中调用普通函数时并不需要带上self参数
3:Python总是首先查找对应类型的方法,如果它不能在派生类中找到对应的方法,它才开始到基类中逐个查找。(先在本类中查找调用的方法,找不到才去基类中找)。
如果在继承元组中列了一个以上的类,那么它就被称作“多重继承” 。
例如(这里的基类相当与父类):


多级继承
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# Author: Colin Yao
msg = '''
class Person(object): #new style
super
class Person(object) #classical style
ParentClass.__init__()
大家主要写新式类的 object
继承顺序的区别、多级继承
'''
class A:#经典类
def __init__(self):
self.n ="A"
class B(A):
#def __init__(self):
# self.n ="B"
pass
class C(A):
# def __init__(self):
# self.n ="C"
pass
class D(B,C):
# def __init__(self):
# self.n ="D"
pass
d = D()
print(d.n)
这里会涉及到新式类和经典类的一个区别:
大概的查找顺序是: py3里新式类和经典类都是横向查找,py2里新式类的查找方式是横向的,例如class D(B,C): 先找B再找C最后找A ,但是经典类则是先找B,在找A不会找C

3.多态,多态指的是一类事物有多种形态,作用就是为了类在继承和派生的时候保证使用家谱中任意类的实例的某一属性的正确调用,也可以说当我们可以向不同的对象发送同一条消息
#多态是同一种事物的多种形态
class Animal:
def talk(self):
print('正在叫') class People(Animal):
def talk(self):
print('say hello') class Pig(Animal):
def talk(self):
print('哼哼哼') class Dog(Animal):
def talk(self):
print('wangwangwang') class Cat(Animal):
def talk(self):
print('喵喵喵')
peo1=People()
pig1=Pig()
dog1=Dog()
cat1=Cat() #多态性 peo1.talk()
dog1.talk()
pig1.talk() def func(x):
x.talk()
func(dog1)
输出:
say hello
哼哼哼
wangwangwang
喵喵喵
参考资料:
http://www.cnblogs.com/zjltt/p/7000695.html
http://www.cnblogs.com/alex3714/articles/5188179.html
http://www.cnblogs.com/Joans/archive/2012/11/09/2757368.html
Python面向对象学习2(面向对象的语法和特性,待更新)的更多相关文章
- Python进阶学习之面向对象
目录 面向对象 私有属性 面向对象 python也有面向对象的编程,它与C++中的类有点相似.它也只是运算符重载,继承. class Test: num=0 def __init__(self): ...
- python基础学习Day17 面向对象的三大特性之继承、类与对象名称空间小试
一.课前回顾 类:具有相同属性和方法的一类事物 实例化:类名() 过程: 开辟了一块内存空间 执行init方法 封装属性 自动的把self返回给实例化对象的地方 对象:实例 一个实实在在存在的实体 组 ...
- python基础学习笔记——面向对象初识
面向对象初识 python中一切皆对象. 类有两种: 新式类:在py3中所有类都是新式类 经典类:在py2中只有类本身继承了object类才叫做新式类,默认是经典类 class Person: cou ...
- python基础学习Day15 面向对象、类名称空间、对象名称空间 (2)
一.类 先看一段代码: class Person: animal = '高级动物' walk_way = '直立行走' # 静态属性,静态变量,静态字段 language = '语言' def __i ...
- python基础学习 Day19 面向对象的三大特性之多态、封装 property的用法(1)
一.课前内容回顾 继承作用:提高代码的重用性(要继承父类的子类都实现相同的方法:抽象类.接口) 继承解释:当你开始编写两个类的时候,出现了重复的代码,通过继承来简化代码,把重复的代码放在父类中. 单继 ...
- python基础学习 Day19 面向对象的三大特性之多态、封装
一.课前内容回顾 继承作用:提高代码的重用性(要继承父类的子类都实现相同的方法:抽象类.接口) 继承解释:当你开始编写两个类的时候,出现了重复的代码,通过继承来简化代码,把重复的代码放在父类中. 单继 ...
- python开发学习-day07(面向对象之多态、类的方法、反射、新式类and旧式类、socket编程)
s12-20160227-day07 *:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom: ...
- Python基础学习之语句和语法
语句和语法 python语句中有一些基本规则和特殊字符: 井号键“#”表示之后的字符为python注释: 三引号(‘‘‘ ’’’)可以多行注释 换行“\n”是标准的行分隔符(通常一个语句一行): 反斜 ...
- Python语言学习前提:基础语法
一.变量 1.变量:存储数据.存储数据需要对应内存空间,基于变量的数据类型,解释器会分配指定内存,决定什么数据被存储到内存中. 变量数据类型:整数.小数.字符. 2.变量赋值:变量在使用前必须赋值,赋 ...
- Python 3 学习笔记之——基础语法
1. a, b = a, a + b 先计算右边表达式,然后再同时赋值给左边. 2. 条件控制和循环语句 条件控制 if condition_1: statement_block_1 elif con ...
随机推荐
- Node js路由
/* 要为程序提供请求的 URL 和其他需要的 GET 及 POST 参数,随后程序需要根据这些数据来执行相应的代码. 因此,需要查看 HTTP 请求,从中提取出请求的 URL 以及 GET/POST ...
- Jenkins系列-Jenkins通过Publish over SSH插件实现远程部署
配置ssh免秘钥登录 安装Publish over SSH插件 插件使用官网:https://wiki.jenkins.io/display/JENKINS/Publish+Over+SSH+Plug ...
- java数组相等
java中数组相等判断: 1.最常规的是遍历 public static boolean arrayEquals(String[] a,String[] b){ boolean flag = fals ...
- 基于实现Controller接口的简单Spring工程
这个Spring工程的特点是:实现了Controller接口(这样就可以在url中传参数?,待调查) 一下为代码,可运行. 1,web.xml <servlet> <servlet- ...
- [剑指Offer] 66.机器人的运动范围
题目描述 地上有一个m行和n列的方格.一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大于k的格子. 例如,当k为18时,机器人能 ...
- SpringBoot2.0(一) mybatis
使用mybatis springboot使用mybatis主要依赖 mybatis-spring-boot-starter 来实现.其提供了2中解决方案,一种是使用注解:另一种是简化后的传统的xml方 ...
- 【.Net】浅谈C#中的值类型和引用类型
在C#中,值类型和引用类型是相当重要的两个概念,必须在设计类型的时候就决定类型实例的行为.如果在编写代码时不能理解引用类型和值类型的区别,那么将会给代码带来不必要的异常.很多人就是因为没有弄清楚这两个 ...
- BZOJ4873 Shoi2017寿司餐厅(最小割)
选择了某个区间就必须选择其所有子区间,容易想到这是一个最大权闭合子图的模型.考虑将区间按长度分层,相邻层按包含关系连边,区间[i,j]的权值即di,j,其中最后一层表示长度为1的区间的同时也表示寿司本 ...
- Python:树的遍历
各种遍历顺序如下图所示: 树的最大深度 # class TreeNode(object): # def __init__(self, x): # self.val = x # self.left = ...
- POJ1279:Art Gallery——题解
http://poj.org/problem?id=1279 题目大意:给按照顺时针序的多边形顶点,问其内核可行区域面积. —————————————————————————————— 终于变了一点… ...