#从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. Day5 - F - 食物链 POJ - 1182

    动物王国中有三类动物A,B,C,这三类动物的食物链构成了有趣的环形.A吃B, B吃C,C吃A.现有N个动物,以1-N编号.每个动物都是A,B,C中的一种,但是我们并不知道它到底是哪一种.有人用两种说法 ...

  2. 7个现在就该学习Python 的理由【80%的人都不知道】

    Python 是一门更注重可读性和效率的语言,尤其是相较于 Java,PHP 以及 C++ 这样的语言,它的这两个优势让其在开发者中大受欢迎. 诚然,它有点老了,但仍是 80 后啊 —— 至少没有 C ...

  3. 解决d7在更高版本上运行乱码问题,或者是调用更高版本的dll

    将String类型改成WideString类型即可

  4. hadoop ozone入门

    简介 众所周知,HDFS是大数据存储系统,并在业界得到了广泛的使用.但是无论大集群还是小集群其扩展性都受NameNode的限制,虽然HDFS可以通过Federation进行扩展,但是依然深受小文件和4 ...

  5. 一、Vue环境搭建及基础用法

    一.项目初始化及安装 官网:https://cn.vuejs.org/ 1.1安装及运行项目步骤 1.安装vue-cli(-g=-global) npm install -g vue-cli cnpm ...

  6. B. Yet Another Crosses Problem

    B. Yet Another Crosses Problem time limit per test 2 seconds memory limit per test 256 megabytes inp ...

  7. Windows按键消息—虚拟键码(转)

    源地址:http://c.biancheng.net/cpp/html/1253.html 虚拟键码保存在WM_KEYDOWN.WM_KEYUP.WM_SYSKEYDOWN和WM_SYSKEYUP消息 ...

  8. netty权威指南学习笔记一——NIO入门(3)NIO

    经过前面的铺垫,在这一节我们进入NIO编程,NIO弥补了原来同步阻塞IO的不足,他提供了高速的.面向块的I/O,NIO中加入的Buffer缓冲区,体现了与原I/O的一个重要区别.在面向流的I/O中,可 ...

  9. tomcat启动报错The JRE could not be found.Edit the server and change the JRE location

    解决: 在Windows->Preferences->Server->Runtime Environments 选择Tomcat->Edit,在jre中选择相应的jdk版本,完 ...

  10. Python基础笔记:list和tuple

    list 与 tuple 就类似于C语言中的数组,list 与 tuple 的区别就是list 可修改,而tuple不可修改: list用法示例: >>> s=[] >> ...