(一)、python鸭子类型

  python作为动态语言继承和多态与静态语言(像java)有很大的不同;比如说在java中的某个方法,如果传入的参数是Animal类型,那么传入的对象必须是Animal类型或者其子类,否则,将无法调用run()方法。对于Python来说,则不一定需要传入Animal类型。我们只需要保证传入的对象有一个run()方法就可以了,这就是动态语言中的“鸭子类型”,不强调严格的继承,只需要“看起来像鸭子就行了,即使你是一只天鹅”,

所以说你的对象只要有那个方法即可,这也是python面向过程或者说面向函数在对象中的体现所在!

# coding=utf-
class Animal(object):
def run(self):
print('看,有只动物在跑') class Dog(Animal):
def run(self):
print('看,是只狗在跑')
def eat(self):
print('那狗在吃东西') class Car(object):
def run(self):
print('车启动了。。。') def gogogo(animal):
animal.run()
# animal.eat() gogogo(Dog())
print("--测试鸭子类型--")
gogogo(Car())

(二)、python中的访问权限 

).在Python中,变量名以双下划线开头(__xxx__),并且以双下划线结尾的,是特殊变量,特殊变量是可以直接访问的,不是private变量,不要将对象的属性名弄成 '__xxx__' 这种格式;
).以 '_xx'开头的实例变量是可以访问的,但是这只是告诉我们,它是可以被访问的,但是要看作私有变量,不要随意访问;
).实例的变量名如果以'__xx'开头,这就成了一个私有变量(private),只有内部可以访问,“外部不能直接访问”,不能直接访问'__xx'是因为Python解释器对外把'__xx'变量改成了'_object__xx'
(这个很重要,可以帮助理解很多问题),所以,仍然可以通过'_object__xx'来访问'__xx'变量。

(三)、实例属性和类属性

# coding=utf-8
# python在创建实例的时候可以动态的绑定属性,给实例绑定属性,通过
dog = Dog()
dog.name = '二哈'
# 或者通过self变量来绑定,self永远代表所创建的实例本身
def __init__(self, name):
self.name = name
# 如果要给Dog类本身绑定一个属性,则
class Dog(Animal):
  name ='er-ha' 属性虽然归类所有,但类的所有实例都可以访问到,可以这么理解类的属性相当于给实例的属性添加个默认值而已

(四)、@property属性

  通过python的@property装饰器,可以更深层次的理解scala中的getter和setter方法,被@property修饰的方法相当于getter,这个修饰器的好处就是不用直接暴露属性但是让使用者看起来“像是直接暴露了属性一样”

原来我们应该这样

#提供方法来设置和得到属性的值
class Car(object): def get_wheel(self):
return self._wheel def set_wheel(self, name):
if not isinstance(name, str):
raise ValueError('wheel must be an str!')
self._wheel = name c = Car()
c.set_wheel = '三角'
print(c.get_wheel)

现在我们这样即可

class Car(object):

    @property
def wheel(self):
return self._wheel @score.setter
def wheel(self, name):
if not isinstance(name, str):
raise ValueError('wheel must be an str!')
self._wheel = name c = Car()
c.wheel = '三角'
print(c.wheel)

(五)、python中的多重继承

  这个特性与java中的interfac和scala中的trait有明显的不同,在python不管你是 is-a 还是 has-a 的关系,一律用class来实现;想给一个类扩展功能,直接继承拥有那个功能的类即可,python中叫“MixIn”(混入),跟scala中“混入”某个特质很相像,目的都是给一个类增加多个功能。

比如编写一个多线程的UDP服务:

class MinInUDPServer(UDPServer, ThreadingMixIn):
pass

通过混入,这样就快速构造出我们需要的子类

python面向对象小tips的更多相关文章

  1. Python codecs小Tips

    Python codecs小Tips 用codecs.open读进来的字符串都是unicode表示的.

  2. Python 知识小tips

    python进制转换函数: 二进制转换成十进制:v = "0b1111011"    # int(v,2) 十进制转换成二进制:v = 18                   # ...

  3. python面向对象小练习

    就是几个动物,自动排列生成什么的 class Animal(object): def __init__(self,name,weight): self.name = name self.weight ...

  4. python 面向对象初级篇

    Python 面向对象(初级篇) 概述 面向过程:根据业务逻辑从上到下写垒代码 函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可 面向对象:对函数进行分类和封装,让开发" ...

  5. Python 面向对象 基础

    编程范式概述:面向过程 和 面向对象 以及函数式编程 面向过程:(Procedure Oriented)是一种以事件为中心的编程思想. 就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现 ...

  6. 12岁的少年教你用Python做小游戏

    首页 资讯 文章 频道 资源 小组 相亲 登录 注册       首页 最新文章 经典回顾 开发 设计 IT技术 职场 业界 极客 创业 访谈 在国外 - 导航条 - 首页 最新文章 经典回顾 开发 ...

  7. Python开发【第七篇】:面向对象 和 python面向对象(初级篇)(上)

    Python 面向对象(初级篇)   51CTO同步发布地址:http://3060674.blog.51cto.com/3050674/1689163 概述 面向过程:根据业务逻辑从上到下写垒代码 ...

  8. python 面向对象进阶之内置方法

    一 isinstance(obj,cls)和issubclass(sub,super) 1.1,isinstance(obj,cls)检查是否obj是否是类 cls 的对象 class Foo(obj ...

  9. python面向对象编程进阶

    python面向对象编程进阶 一.isinstance(obj,cls)和issubclass(sub,super) isinstance(obj,cls)检查是否obj是否是类 cls 的对象 1 ...

随机推荐

  1. vue组件使用细节

    ref 当ref写在一个标签元素中,通过this.$refs.name 获取的是标签对应的dom元素 <section id="app" ref="froggy&q ...

  2. Maven--Cargo远程部署

    参考:https://www.digitalocean.com/community/questions/how-to-access-tomcat-8-admin-gui-from-different- ...

  3. ADS1.2 调试问题

    最近一个程序需要用到ADS1.2这个软件,在使用过程中出现了如下问题: 1.由于以前用的是KEIL,所以没找到文件的工程,查资料才发现,这个工程文件打开的文件是MCP格式的文件: 2.调试的时候,没找 ...

  4. 触发器-- 肖敏_入门系列_数据库进阶 60、触发器(三) --youku

    二 https://v.youku.com/v_show/id_XMzkxOTc5NDY0OA==.html?spm=a2h0k.11417342.soresults.dtitle 三 https:/ ...

  5. node.js实现http服务器进行访问

    步骤:一.安装node;二.新建一个文件夹目录(根目录),里面再新建一个server.js文件:三.打开命令行界面,进入文件夹目录然后输入命令node server.js;四.然后就可以在浏览器上通过 ...

  6. softmax推导以及多分类的应用

  7. 12 Spring Data JPA:orm思想和hibernate以及jpa的概述和jpa的基本操作

    spring data jpa day1:orm思想和hibernate以及jpa的概述和jpa的基本操作 day2:springdatajpa的运行原理以及基本操作 day3:多表操作,复杂查询 d ...

  8. 图形化编程娱乐于教,Kittenblock实例,测试声音的响度

    跟很多学生聊过,很多学生不是不努力,只是找不到感觉.有一点不可否认,同样在一个教室上课,同样是一个老师讲授,学习效果迥然不同.关键的问题在于,带入感,我能给出的建议,就是咬咬牙,坚持住,没有学不会的知 ...

  9. Java之线程通信的方法

    /** * 线程通信的例子:使用两个线程打印 1-100.线程1, 线程2 交替打印 * * 涉及到的三个方法: * wait():一旦执行此方法,当前线程就进入阻塞状态,并释放同步监视器. * no ...

  10. 关于Spring的使用总结

    简介 Spring框架是一种轻量级的.一站式的企业级开发解决方案 框架(framework):是一组设计思想.规范.API的精心组合,专门用来解决某一层次或领域的问题 轻量级(lightweight) ...