上一个内容我们介绍了面向对象和面向对象场景现在我们来学习下语法和特性

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(面向对象的语法和特性,待更新)的更多相关文章

  1. Python进阶学习之面向对象

    目录 面向对象 私有属性 面向对象   python也有面向对象的编程,它与C++中的类有点相似.它也只是运算符重载,继承. class Test: num=0 def __init__(self): ...

  2. python基础学习Day17 面向对象的三大特性之继承、类与对象名称空间小试

    一.课前回顾 类:具有相同属性和方法的一类事物 实例化:类名() 过程: 开辟了一块内存空间 执行init方法 封装属性 自动的把self返回给实例化对象的地方 对象:实例 一个实实在在存在的实体 组 ...

  3. python基础学习笔记——面向对象初识

    面向对象初识 python中一切皆对象. 类有两种: 新式类:在py3中所有类都是新式类 经典类:在py2中只有类本身继承了object类才叫做新式类,默认是经典类 class Person: cou ...

  4. python基础学习Day15 面向对象、类名称空间、对象名称空间 (2)

    一.类 先看一段代码: class Person: animal = '高级动物' walk_way = '直立行走' # 静态属性,静态变量,静态字段 language = '语言' def __i ...

  5. python基础学习 Day19 面向对象的三大特性之多态、封装 property的用法(1)

    一.课前内容回顾 继承作用:提高代码的重用性(要继承父类的子类都实现相同的方法:抽象类.接口) 继承解释:当你开始编写两个类的时候,出现了重复的代码,通过继承来简化代码,把重复的代码放在父类中. 单继 ...

  6. python基础学习 Day19 面向对象的三大特性之多态、封装

    一.课前内容回顾 继承作用:提高代码的重用性(要继承父类的子类都实现相同的方法:抽象类.接口) 继承解释:当你开始编写两个类的时候,出现了重复的代码,通过继承来简化代码,把重复的代码放在父类中. 单继 ...

  7. python开发学习-day07(面向对象之多态、类的方法、反射、新式类and旧式类、socket编程)

    s12-20160227-day07 *:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom: ...

  8. Python基础学习之语句和语法

    语句和语法 python语句中有一些基本规则和特殊字符: 井号键“#”表示之后的字符为python注释: 三引号(‘‘‘ ’’’)可以多行注释 换行“\n”是标准的行分隔符(通常一个语句一行): 反斜 ...

  9. Python语言学习前提:基础语法

    一.变量 1.变量:存储数据.存储数据需要对应内存空间,基于变量的数据类型,解释器会分配指定内存,决定什么数据被存储到内存中. 变量数据类型:整数.小数.字符. 2.变量赋值:变量在使用前必须赋值,赋 ...

  10. Python 3 学习笔记之——基础语法

    1. a, b = a, a + b 先计算右边表达式,然后再同时赋值给左边. 2. 条件控制和循环语句 条件控制 if condition_1: statement_block_1 elif con ...

随机推荐

  1. Dubbo分享

    1. Dubbo是什么? Dubbo是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案.简单的说,dubbo就是个服务框架,如果没有分布式的需求,其实是不需 ...

  2. my.conf 修改编码

    mysql汉字乱码的原因 mysql默认的编码是Latin1是I-8859-1的别名,但Latin1是不支持汉字的,所以要将其改为UTF-8或GBK 1.关闭mysql服务器,这个很重要. 2.通过m ...

  3. 【Docker 命令】- ps命令

    docker ps : 列出容器 语法 docker ps [OPTIONS] OPTIONS说明: -a:显示所有的容器,包括未运行的. -f:根据条件过滤显示的内容. --format :指定返回 ...

  4. SQL SERVER技术内幕之6 集合查询

    1.定义 集合运算会对两个输入查询的结果集进行逐行比较,根据比较结果和所使用的集合运算来确定某一行是否应该包含在集合运算的结果中.因为集合运算是针对集合之间进行的计算,所以集合运算涉及的两个查询不能包 ...

  5. ExtremeComponents源码解析(一)

    一.前言 因参与公司框架改造,在负责前端table组件选型时,原本选了jqGrid和Bootstraptable作为备选方案,评审会上,武哥提了EXtremeComponents,让我也去了解下,看下 ...

  6. Atom IDE开发工具, ASCII艺术评论, ninimap 插件

    1 ASCII Art Comments One neat trick is to use ASCII art to create huge comments visible in the minim ...

  7. 【bzoj1596】[Usaco2008 Jan]电话网络 树形dp

    题目描述 Farmer John决定为他的所有奶牛都配备手机,以此鼓励她们互相交流.不过,为此FJ必须在奶牛们居住的N(1 <= N <= 10,000)块草地中选一些建上无线电通讯塔,来 ...

  8. Socket网络编程实例1

    Socket: 对所有上层协议(TCP/IP,UDP等)的底层封装. 网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket. 建立网络通信连接至少要一对端口号(so ...

  9. CentOS 用户管理useradd、usermod等

    1.创建新用户useradd,默认的用户家目录会被存放在/home 目录中,默认的 Shell 解释器为/bin/bash,而且默认会创建一个与该用户同名的基本用户组. 主要参数: -d 指定用户的家 ...

  10. 【转】PowerDesigner中Table视图同时显示Code和Name

    为避免图片失效,文字描述, Tools-Display Preference-->左侧Table-->右下角Advanced-->左侧树Columns-->右侧上面第一个放大镜 ...