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

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. 第四部分shell编程5项目二分发系统

    第一部分:expect讲解expect可以让我们实现自动登录远程机器,并且可以实现自动远程执行命令.当然若是使用不带密码的密钥验证同样可以实现自动登录和自动远程执行命令.但当不能使用密钥验证的时候,我 ...

  2. 制作QQ微信支付宝三合一收款码

    转载:http://blog.mambaxin.com/article/56 发现很多博客都带了打赏功能,虽说打赏的人可能很少,但始终是一份心意,能让博主知道自己写的文章有用,能够帮助到人.所以,我也 ...

  3. JAVA的中文字符乱码问题

    来源:http://luzefengoo.blog.163.com/blog/static/1403593882012754428536/ JAVA的中文字符乱码问题一直很让人头疼.特别是在WEB应用 ...

  4. Redis 学习之常用命令及安全机制

    该文使用centos6.5 64位    redis3.2.8 一.redis常用命令 键值常用命令: 1. keys 返回满足pattern的所有key. 127.0.0.1:6379> ke ...

  5. js 事件阻止传播方法,准确定位事件源

    1事件冒泡 在目标元素获得机会处理事件后,事件模型检查目标元素的父元素,看是否为同类型事件建立了处理程序.如果是,则也调用父元素的处理程序.在这之后,再检查其父元素,然后父元素,然后父元素...持续不 ...

  6. HDU 3879 Base Station(最大权闭合子图)

    将第i个用户和他需要的基站连边,转化成求二分图的最大权闭合子图. 答案=正权点之和-最小割. # include <cstdio> # include <cstring> # ...

  7. es6常用基础合集

    es6常用基础合集 在实际开发中,ES6已经非常普及了.掌握ES6的知识变成了一种必须.尽管我们在使用时仍然需要经过babel编译. ES6彻底改变了前端的编码风格,可以说对于前端的影响非常巨大.值得 ...

  8. RESTful Webservice

    1,REST和RESTFUL是什么? REST ( REpresentational State Transfer ),State Transfer 为 "状态传输" 或 &quo ...

  9. BZOJ3571 & 洛谷3236:[HNOI2014]画框——题解

    https://www.lydsy.com/JudgeOnline/problem.php?id=3571 https://www.luogu.org/problemnew/show/P3236 小T ...

  10. HDU5115:Dire Wolf——题解+翻译

    http://acm.hdu.edu.cn/showproblem.php?pid=5115 题目大意:给n匹狼,每一次攻击可以秒杀一匹狼,但同时会受到这匹狼的a攻击和它相邻两只狼的b攻击. 给定a, ...