#从python开始学习编程 学习笔记

以后看书时注意一下书上表述:好像是类属性attribute,对象特性property,对象方法

1、对于一个类下的全部个体来说,某些属性可能存在个体差异。不是所有的人类都是男,或者都是女。这个性质的值随着对象的不同而不同。

因此,为了完整描述个体,除了共性的类属性外,我们还需要用于说明个性的对象属性。在类中,我们可以通过self来操作对象的属性。

2、python提供了初始化对象属性的办法,python定义了一系列特殊方法,又称为魔法方法,前后有两个下划线,比如__init__()、__add__()、__dict__()等

3、对于类的__init__()方法,python会在每次创建对象时自动调用。因此,我们可以在__init__()方法内部来初始化对象属性。

4、除了操作对象属性外,self参数还有另外一个功能,就是能让我们在一个方法内部调用同一类的其他方法。

5、覆盖,一般情况下,子类和父类都有的方法,子类会覆盖父类的方法,可以调用super函数保留父类方法(有点奇怪,搞两个方法干啥了??)

class Bird:
def chirp(self):
print('make sound') class Chicken(Bird):
def chirp(self):
super().chirp()
print('ji')
summer=Chicken()
print(summer.chirp())
# make sound
# ji
# None
#从结果来看,先调用父类方法,再调用子类方法

6、一切皆对象:我们知道,list是列表的类。如果用dir(list)查看list的属性,能看到一个属性是__add__(),从样式来看,__add__()是特殊方法(魔法方法)。

他特殊在哪呢?这个方法定义了‘+’运算符对于list对象的意义,两个list对象相加时,会进行合并列表的操作。

(1.8).__mul__(2.8)      #5.04
True.__or__(False) #True
[1,2,3]+[4,5,6] #[1, 2, 3, 4, 5, 6]
['abc']+['def'] #['abc', 'def']
'abc'.__add__('def') #'abcdef'

7、属性覆盖的背后

class Bird:
feather=True
def chirp(self):
print('some sound')
class Chicken(Bird):
fly=False
def __init__(self,age):
self.age=age
def chirp(self):
print('ji')
summer=Chicken(2)
print('==============> summer')
print(summer.__dict__)
print('==============> Chicken')
print(Chicken.__dict__)
print('==============> Bird')
print(Bird.__dict__)
print('==============> object')
print(object.__dict__)
==============> summer
{'age': 2}
==============> Chicken
{'__module__': '__main__', 'fly': False, '__init__': <function Chicken.__init__ at 0x00000188456A0488>, 'chirp': <function Chicken.chirp at 0x00000188456A0510>, '__doc__': None}
==============> Bird
{'__module__': '__main__', 'feather': True, 'chirp': <function Bird.chirp at 0x00000188456A0598>, '__dict__': <attribute '__dict__' of 'Bird' objects>, '__weakref__': <attribute '__weakref__' of 'Bird' objects>, '__doc__': None}
==============> object
{'__repr__': <slot wrapper '__repr__' of 'object' objects>, '__hash__': <slot wrapper '__hash__' of 'object' objects>, '__str__': <slot wrapper '__str__' of 'object' objects>, '__getattribute__': <slot wrapper '__getattribute__' of 'object' objects>, '__setattr__': <slot wrapper '__setattr__' of 'object' objects>, '__delattr__': <slot wrapper '__delattr__' of 'object' objects>, '__lt__': <slot wrapper '__lt__' of 'object' objects>, '__le__': <slot wrapper '__le__' of 'object' objects>, '__eq__': <slot wrapper '__eq__' of 'object' objects>, '__ne__': <slot wrapper '__ne__' of 'object' objects>, '__gt__': <slot wrapper '__gt__' of 'object' objects>, '__ge__': <slot wrapper '__ge__' of 'object' objects>, '__init__': <slot wrapper '__init__' of 'object' objects>, '__new__': <built-in method __new__ of type object at 0x0000000059A8B580>, '__reduce_ex__': <method '__reduce_ex__' of 'object' objects>, '__reduce__': <method '__reduce__' of 'object' objects>, '__subclasshook__': <method '__subclasshook__' of 'object' objects>, '__init_subclass__': <method '__init_subclass__' of 'object' objects>, '__format__': <method '__format__' of 'object' objects>, '__sizeof__': <method '__sizeof__' of 'object' objects>, '__dir__': <method '__dir__' of 'object' objects>, '__class__': <attribute '__class__' of 'object' objects>, '__doc__': 'The most base type'}

第一行为bird类的属性,比如feather。第二行为chicken类的属性,比如fly和__init__方法。第三行为summer对象的属性,也就是age。有一些属性,比如__doc__,并不是由我们定义的,而是由Python自动生成。此外,bird类也有父类,是object类(正如我们的bird定义,class bird(object))。这个object类是Python中所有类的父类。

print(dir(summer))
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'age', 'chirp', 'feather', 'fly']

如果我们用内置函数dir来查看summer的属性的话,可以看到summer对象包含了全部四个部分,也就是说,Python中的属性是分层定义的,比如这里分为object/bird/chicken/summer这四层。当我们需要调用某个属性的时候,Python会一层层向上遍历,直到找到那个属性。(某个属性可能出现在不同的层被重复定义,Python向上的过程中,会选取先遇到的那一个,也就是比较低层的属性定义)。这正是属性覆盖的原理所在。由于对象不需要重复存储其祖先类的属性,所以分层管理的机制可以节省存储空间。

值得注意的是,上面都是调用属性的操作,如果进行赋值,那么python就不会分层深入查找了。

autumn=Chicken(3)
autumn.feather=False
print(summer.feather) #True
print(autumn.__dict__) #{'age': 3, 'feather': False}

因此,python在为属性赋值时,只会搜索对象本身的__dict__,如果找不到对应属性,则将在__dict__中增加。在类 定义的方法中,如果用self引用对象,

也会遵守相同规则。

此外,我们可以不依赖继承关系,直接去操作某个祖先类的属性。

Bird.feather=3

8、特性

同一个对象的不同属性之间可能存在依赖关系。当某个属性被修改时,我们希望依赖于该属性的其他属性也同时变化。这时,我们不能通过__dict__的静态词典

方式来存储属性。Python提供了多种即时生成属性的方法。其中一种称为特性(property)。特性是特殊的属性。

class Bird:
feather=True
class Chicken(Bird):
fly=False
def __init__(self,age):
self.age=age
def get_adult(self):
if self.age>1.0:
return True
else:
return False
adult=property(get_adult) #property is bulit-in
summer=Chicken(2)
print(summer.adult) #True
print(summer.get_adult())#True
summer.age=0.5
print(summer.adult) #False
print(summer.get_adult()) #False
class Bird:
feather=True
class Chicken(Bird):
fly=False
def __init__(self,age):
self.age=age
@property
def get_adult(self):
if self.age>1.0:
return True
else:
return False
summer=Chicken(2)
print(summer.get_adult)#True
summer.age=0.5
print(summer.get_adult) #False

9、比较如下代码区别:

class Bird:
feather=True
age=2
def __init__(self,name):
self.name=name
class Chicken(Bird):
fly=False
def __init__(self,age):
self.age=age
@property
def get_adult(self):
if self.age>1.0:
return True
else:
return False
summer=Chicken(2)
print(summer.get_adult)#True
summer.age=0.5
print(summer.get_adult) #False
class Bird:
feather=True
age=2
def __init__(self,name):
self.name=name
class Chicken(Bird):
fly=False
# def __init__(self,age):
# self.age=age
@property
def get_adult(self):
if self.age>1.0:
return True
else:
return False
summer=Chicken()
print(summer.get_adult)
summer.age=0.5
print(summer.get_adult)
#如果用self引用对象,本层没有,好像会找到父类那一层去。
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-48-496496d87f7c> in <module>()
14 else:
15 return False
---> 16 summer=Chicken()
17 print(summer.get_adult)#True
18 summer.age=0.5 TypeError: __init__() missing 1 required positional argument: 'name'
class Bird:
feather=True
age=2
def __init__(self,name):
self.name=name
class Chicken(Bird):
fly=False
# def __init__(self,age):
# self.age=age
@property
def get_adult(self):
if self.age>1.0:
return True
else:
return False
summer=Chicken(2)
print(summer.get_adult)#True
summer.age=0.5
print(summer.get_adult) #False
class Bird:
feather=True
age=2
def __init__(self,name):
self.name=name
class Chicken(Bird):
fly=False
age=2 #增加age=2
# def __init__(self,age):
# self.age=age
@property
def get_adult(self):
if self.age>1.0:
return True
else:
return False
summer=Chicken()
print(summer.get_adult)
summer.age=0.5
print(summer.get_adult)
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-50-9ac0fb881573> in <module>()
15 else:
16 return False
---> 17 summer=Chicken()
18 print(summer.get_adult)#True
19 summer.age=0.5 TypeError: __init__() missing 1 required positional argument: 'name'
class Bird:
feather=True
age=2
class Chicken(Bird):
fly=False
@property
def get_adult(self):
if Bird.age>1.0:
return True
else:
return False
summer=Chicken()
print(summer.get_adult)#True
summer.age=0.5
print(summer.get_adult) #True

与上面类似,修改了实例特性,但是类属性没有修改,通过类方法调用的时候修改不起 作用,类属性没有修改。

class A:
x='jim'
@classmethod
def run(cls):
y=cls.x
print('{} is running'.format(y))
return y
class B(A):
pass
b=B()
print(b.run())
b.x='yang'
print(b.x)
print(A.x)
print(b.run())
#jim is running
#jim
#yang
#jim
#jim is running
#jim

10、特性使用内置函数property()来创建。property()最多可以加载四个参数。前三个参数为函数,分别用于设置获取、修改和删除特性是,Python应该执行的操作。最后一个参数为特性的文档,可以为一个字符串,起说明作用。

class Num:
def __init__(self,value):
self.value=value
def get_neg(self):
return -self.value
def set_neg(self,value):
self.value=-value
def del_neg(self):
print('value also deleted')
del self.value
neg=property(get_neg,set_neg,del_neg,'i am negative')
x=Num(1.2)
print(x.neg) # -1.2
x.neg=-22
print(x.value) #
print(Num.neg.__doc__) #i am negative
del x.neg #value also deleted

python类(2)的更多相关文章

  1. Python类中super()和__init__()的关系

    Python类中super()和__init__()的关系 1.单继承时super()和__init__()实现的功能是类似的 class Base(object): def __init__(sel ...

  2. LightMysql:为方便操作MySQL而封装的Python类

    原文链接:http://www.danfengcao.info/python/2015/12/26/lightweight-python-mysql-class.html mysqldb是Python ...

  3. python 类属性与方法

    Python 类属性与方法 标签(空格分隔): Python Python的访问限制 Python支持面向对象,其对属性的权限控制通过属性名来实现,如果一个属性有双下划线开头(__),该属性就无法被外 ...

  4. python 类以及单例模式

    python 也有面向对象的思想,则一切皆对象 python 中定义一个类: class student: count = 0         books = [] def __init__(self ...

  5. Python类的特点 (1):构造函数与方法

    Python中,类的特点: #encoding:utf-8 class Parent(object): x=1 #x是Parent类的属性(字段) def __init__(self): print ...

  6. Python类属性,实例属性

    1.Python类数据属性:定义在类里面但在函数外面的变量,它们都是静态的. #一段很简单的代码,但反应了很多 >>> class A(): a=1 #一个类里面有个属性a > ...

  7. python类及其方法

    python类及其方法 一.介绍 在 Python 中,面向对象编程主要有两个主题,就是类和类实例类与实例:类与实例相互关联着:类是对象的定义,而实例是"真正的实物",它存放了类中 ...

  8. python类的定义和使用

    python中类的声明使用关键词class,可以提供一个可选的父类或者说基类,如果没有合适的基类,那就用object作为基类. 定义格式: class 类名(object): "类的说明文档 ...

  9. Python类的探讨

    我们下面的探讨基于Python3,我实际测试使用的是Python3.2,Python3与Python2在类函数的类型上做了改变 1,类定义语法  Python类定义以关键字class开头,一个类定义例 ...

  10. python - 类成员修饰符

    在java,c#类的成员修饰符包括,公有.私有.程序集可用的.受保护的. 对于python来说,只有两个成员修饰符:公有成员,私有成员 成员修饰符是来修饰谁呢?当然是修饰成员了.那么python类的成 ...

随机推荐

  1. XV6源代码阅读-文件系统

    Exercise1 源代码阅读 文件系统部分 buf.h fcntl.h stat.h fs.h file.h ide.c bio.c log.c fs.c file.c sysfile.c exec ...

  2. 用JS写一个网站树形菜单

    先上效果图: 主体内容就是侧边展示的一二三级菜单,树形结构的. 前端页面布局内容,页面内容简单用ul li 来完成所有的罗列项.用先后顺序来区分一级二级三级: <body> <b&g ...

  3. ubuntu14安装一些常用的软件

    1.搜狗输入法: 2.sublime 3. 搜狗输入法在Linux里面还是很正常的,并没有想在windows下那样充斥这各种广告. 在搜狗的官网下载了输入法-->双击安装-->提示存在依赖 ...

  4. Day4 - I - Trucking HDU - 2962

    A certain local trucking company would like to transport some goods on a cargo truck from one place ...

  5. Element-UI Table 实现筛选数据功能

    最近产品提出了一个筛选数据的功能,要求在表头里实现一个下拉框进行筛选. 首先, Element-ui 的官方文档,el-table-column 下有一个 filters , 用于数据的筛选和过滤, ...

  6. 022、Java中boolean的用法

    01.代码如下: package TIANPAN; /** * 此处为文档注释 * * @author 田攀 微信382477247 */ public class TestDemo { public ...

  7. etcd入门

    简介 etcd是CoreOS团队于2013年6月发起的开源项目,它的目标是构建一个高可用的分布式键值(key-value)数据库. etcd内部采用raft协议作为一致性算法,基于Go语言实现. et ...

  8. RadioButton之互斥选择和Toast显示

    前言: RadioButton用来单选并且用Toast来进行提示所选内容 RadioButton标签单独写的时候不能出现互斥现象,代码如下 <RadioButton android:layout ...

  9. JVM--a == (a = b)基于栈的解释器执行过程

    前言 在翻阅ConcurrentLinkedQueue的代码的时候,发现这样一段代码在JDK源码中总是出现. t != (t = tail) 原先总是以为这不就是 t != t ?很是纳闷,遂Demo ...

  10. 5 —— node —— 响应一段中文给客户端

    const http = require('http'); const server = http.createServer(); server.on('request',function(req,r ...