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 ... 
随机推荐
- 关于houghlines函数角度问题的说明
			以上是opecv reference里面的说明. Image必须是8位单通道图(可以使灰度图.二值图.边缘图等) Rho:距离分辨率,一般为1 Theta:角度分辨率,一般为CV_PI/180 Thr ... 
- dedecms添加新模型
			dedecms虽然预设了一些常见网页的功能模型,但是如果需要新的功能则需要自己创建,dedecms也提供了创建新模型的功能,如下: 1.打开后台首页=>核心=>内容模型管理 2.添加新模型 ... 
- centos7 nginx端口转发出现502的其中一种原因
			在排查了一系列可能的原因后仍无法解决,经资料查阅可能是SELinux造成,SELinux很强大但若配置不当也会造成很多组件无法正常使用,这里直接将其关闭: //打开配置文件 vi /etc/selin ... 
- C#中WVVM的使用
			学习WVVM模式,设计一个简单的菜单显示和选择时显示个数的一个例子. 最终效果: 所建文件结构如下: MenuModel:菜品属性-名称和价格 using System; using System.C ... 
- 利用FluidMoveBehavior制作出手机通讯录平滑的效果
			最近学习Blend,原来Blend制作动画等效果非常棒.下面演示一下FluidMoveBehavior应用,利用Blend中行为中的FluidMoveBehavior制作出手机通讯录平滑的效果 1.在 ... 
- 【Json】C#格式化JSON字符串
			很多时候我们需要将json字符串以 { "status": 1, "sum": 9 }这种方式显示,而从服务端取回来的时候往往是这样 {&quo ... 
- android四大组件(一)Activity
			一.创建一个新的Activity 1.android的四大组件都要在清单文件里面配置 2.如果想让你的应用有多个启动图标,你的activity需要这样配置 <intent-filter> ... 
- BZOJ4300 绝世好题(动态规划)
			设f[i][j]为前i个数中所选择的最后一个数在第j位上为1时的最长序列长度,转移显然. #include<iostream> #include<cstdio> #includ ... 
- POJ2749:Building roads——题解
			http://poj.org/problem?id=2749 (这个约翰的奶牛真多事…………………………) i表示u与s1连,i+n表示u与s2连. 老规矩,u到v表示取u必须取v. 那么对于互相打架 ... 
- [Leetcode] search insert position 寻找插入位置
			Given a sorted array and a target value, return the index if the target is found. If not, return the ... 
