-------------------类属性和实例属性关系-------------------
1、类属性和实例属性关系
1、实例属性
实例对象独有的属性
2、类属性
类名访问类属性
3、实例中无同名属性时,可访问到类属性,当定义同名实例属性时,则无法访问
4、常用的查找指令
1、vars :查看实例内属性
2、dir :显示类属性和所有实例属性
3、type :显示类型
-------------------方法-------------------
1、实例方法
隐含的参数为类实例self
2、类方法
隐含的参数为类本身cls
3、静态方法
为隐含参数,主要为了类实例也可以直接调用静态方法
4、类名可以调用类方法和静态方法,但不可以调用实例方法
5、实例:
class Test(object):
def instancefun(self):
print("InstanceFun")
print(self)
@classmethod
def classfun(cls):
print("ClassFun")
print(cls)
@staticmethod
def staticfun():
print("StaticFun")
-------------------私有化-------------------
1、xx :公有变量
2、_x :单前置下划线,私有化属性或方法,from somemodule import *禁止导入,类对象和子类可以访问
3、__xx :双前置下划线,避免与子类中的属性命名冲突,无法在外部直接访问(名字重整所以访问不到)
4、__xx__ :双前后下划线,用户名字空间的魔法对象或属性。例如:init , __ 不要自己发明这样的名字
5、xx__ :单后置下划线,用于避免与Python关键词的冲突
6、示例:
#人类
class Person(object):
def __init__(self,name,age,state):
self.name = name
self._age = age
self.__state = state
def personshow(self):
print self.name
print self._age
print self.__state
def _work(self):
print('in work')
def __away(self):
print('in away')
#学生类继承人
class Student(Person):
def setInfo(self,name,age,state):
self.name = name
self._age = age
self.__state = state
def studentshow(self):
print self.name
print self._age
print self.__state
#main入口
if __name__ == '__main__':
#创建一个人类的对象
person = Person('xiaohao', 18, 'football')
person.personshow()
#创建一个学生对象
student = Student('xiaohao', 18, 'football')
student.setInfo('xiaowang',25,'basketball')
student.studentshow()
student.personshow()
person._work()
person._Person__away()
-------------------分析一个类-------------------
1、__init__
1、说明 :构造初始化函数
2、触发条件 :创建实例后,赋值时使用,在new后
2、__new__
1、说明 :生成实例所需属性
2、触发条件 :创建实例时
3、__class__
1、说明 :实例所在的类
2、触发条件 :实例__class__
4、__str__
1、说明 :实例字符串表示,可读性
2、触发条件 :print(类实例),如没实现,使用repr结果
5、__repr__
1、说明 :实例字符串表示,准确性
2、触发条件 :类实例 回车 或者 print(repr(类实例))
6、__del__
1、说明 :析构
2、触发条件 :del删除实例
7、__dict__
1、说明 :实例自定义属性
2、触发条件 :vars(实例 dict)
8、__doc__
1、说明 :类文档,子类不继承
2、触发条件 :help(类或实例)
9、__getattribute__
1、说明 :属性访问拦截器
2、触发条件 :访问实例属性时,优先级高于__dict__访问
3、实例 :
#coding=utf-8
class Itcast(object):
def __init__(self,subject1):
self.subject1 = subject1
self.subject2 = 'cpp'
#属性访问时拦截器,打log
def __getattribute__(self,obj):
if obj == 'subject1':
print('log subject1')
return 'redirect python'
else: #测试时注释掉这2行,将找不到subject2
return object.__getattribute__(self,obj)
def show(self):
print 'this is Itcast'
s = Itcast('python')
print s.subject1
print s.subject2
10、__bases__
1、说明 :类的所有父类构成元素
2、触发条件 :
-------------------属性保护-------------------
1、实例:
#coding=utf-8
class Man(object):
def __init__(self, name, age):
self._name = name
self._age = age
@property
def name(self):
return self._name
@property
def age(self):
return self._age
@age.setter
def age(self, age):
if not isinstance(age, int):
raise ValueError('age should be int')
if age < 0 or age > 150:
raise ValueError('age should be 0-150')
self._age = age
m = Man('jack', 32)
print(m.name)
print(m.age)
m.age = 40
print(m.age)
m.name = 'rose' #此处报错
-------------------面向对象设计-------------------
1、封装:
2、继承:class Cat(Animle) class Animle(object)
1、重写
class Cat(Animle):
def chi(self):
重写
Animal.chi(self)
3、多态:
1、虚方法
2、抽象方法
3、接口
4、示例:
class Dog(Animal):
def chi(self):
print 'chi'
def test(animal):
animal.chi()
dog = Dog()
test(dog)
- Python学习之面向对象进阶
面向对象进阶当然是要谈谈面向对象的三大特性:封装.继承.多态 @property装饰器 python虽然不建议把属性和方法都设为私有的,但是完全暴露给外界也不好,这样,我们给属性赋值的有效性九无法保证 ...
- Python学习之==>面向对象编程(二)
一.类的特殊成员 我们在Python学习之==>面向对象编程(一)中已经介绍过了构造方法和析构方法,构造方法是在实例化时自动执行的方法,而析构方法是在实例被销毁的时候被执行,Python类成员中 ...
- Python学习day15-函数进阶(3)
figure:last-child { margin-bottom: 0.5rem; } #write ol, #write ul { position: relative; } img { max- ...
- Python学习day14-函数进阶(2)
figure:last-child { margin-bottom: 0.5rem; } #write ol, #write ul { position: relative; } img { max- ...
- Python学习day13-函数进阶(1)
Python学习day13-函数进阶(1) 闭包函数 闭包函数,从名字理解,闭即是关闭,也就是说把一个函数整个包起来.正规点说就是指函数内部的函数对外部作用域而非全局作用域的引用. 为函数传参的方式有 ...
- 周末班:Python基础之面向对象进阶
面向对象进阶 类型判断 issubclass 首先,我们先看issubclass() 这个内置函数可以帮我们判断x类是否是y类型的子类. class Base: pass class Foo(Base ...
- Python中级 —— 01面向对象进阶
面向对象进阶 总结.补充(http://blog.csdn.net/fgf00/article/details/52479307) 面向对象高级语法部分 静态方法.类方法.属性方法 类的特殊方法 反射 ...
- python 学习分享-面向对象2
面向对象进阶 静态方法 一种普通函数,就位于类定义的命名空间中,它不会对任何实例类型进行操作.使用装饰器@staticmethod定义静态方法.类对象和实例都可以调用静态方法: class Foo: ...
- 学习PYTHON之路, DAY 8 - PYTHON 基础 8 (面向对象进阶)
类的成员 类的成员可以分为三大类:字段.方法和属性 注:所有成员中,只有普通字段的内容保存对象中,即:根据此类创建了多少对象,在内存中就有多少个普通字段.而其他的成员,则都是保存在类中,即:无论对象的 ...
随机推荐
- Ajax 基本使用的四大步骤,简单易懂
ajax(异步javascript xml) 能够刷新局部网页数据而不是重新加载整个网页.接下来通过本文给大家介绍Ajax的使用四大步骤,非常不错,感兴趣的朋友看下吧 什么是ajax? ajax(异步 ...
- 安装oh-my-zsh
目标:安装oh-my-zsh,并使用last-working-dir插件(再次登录时,默认在上次退出时的目录)环境:CentOS 7.3.1611 最好看原著 -> https://github ...
- Fliptile 翻格子游戏[Usaco2007 Open]
题目描述 Farmer John knows that an intellectually satisfied cow is a happy cow who will give more milk. ...
- 整理自己的.net工具库
前言 今天我会把自己平日整理的工具库给开放出来,提供给有需要的朋友,如果有朋友平常也在积累欢迎提意见,我会乐意采纳并补充完整.按照惯例在文章结尾给出地址^_^. 之前我开放其他源码的时候(Framew ...
- JavaScript数组遍历(迭代)方法 8种
最近工作中经常涉及到数据的处理,数组尤其常见,经常需要对其进行遍历.转换操作,网上的文章零零散散,不得已自己又找出红宝书来翻出来看,顺便记一笔,便于以后查询. 数组常用的方法 ECMAScript5为 ...
- [PGM] Exact Inference for calculating marginal distribution
如何在贝叶斯网络中求解某变量的边缘分布? 这是一个问题. 贝叶斯网络如下: CPTs如下: (1) How to compute p( L | C = high )? p( L | C = high ...
- 《利用python进行数据分析》NumPy基础:数组和矢量计算 学习笔记
一.有关NumPy (一)官方解释 NumPy is the fundamental package for scientific computing with Python. It contains ...
- 时序分解算法:STL
1. 详解 STL (Seasonal-Trend decomposition procedure based on Loess) [1] 为时序分解中一种常见的算法,将某时刻的数据\(Y_v\)分解 ...
- 关于浏览器解析html全过程详解
本人web前端菜鸟一枚,第一次在这里发博客梳理知识,知识都是从各地方查阅引用以及自己的理解得来,有什么错误的地方欢迎指正. DOM文档通常加载的步骤: 1.解析HTML结构. 2.加载外部脚本和样式表 ...
- iOS项目之wifi局域网传输文件到iPhone的简单实现
如今手机发展非常迅速,app的种类也琳琅满目,而自从有了4G网之后,手机流量也越来越不够用了.所以现在越来越多的app有了本地文件的管理功能,方便用户随意浏览手机文件的同时,也为用户节约了流量的使用. ...