共计 2397 个字符,预计需要花费 6 分钟才能阅读完成。
叨叨点啥
2018 年的最后一天。回顾这一年,获得很多也失去很多。今年去了很多的地方,成都,重庆,峨眉山,天津,杭州,南京。杭州是我特别喜欢的城市,有很多美好的记忆,也有很多失落的时刻。南京现在算是我的一个治愈城市了,带着重重的悲伤去,幸好落雪的瞬间将我治愈。今年努力回温了很多次的这两年,发现很多事情都在最早的时候就有预知,我可以努力做好的事情却没有做到,这就是为什么我会背负悲伤的原因。2019 年,要更加努力,想做到的事情就一定要做到。然后祝福我爱的人,一切都好。希望有缘,还能再度相见吧。
2019 年,世界和平,平安喜乐。
认真学习的分割
恩今天的鸡血针剂,还是用同一管吧~ 每一个优秀的人,都有一段沉默的时光。那一段时光,是付出了很多努力,忍受孤独和寂寞,不抱怨,不诉苦,日后说起时,连自己都能被感动的日子。
面向对象编程
类和实例
面向对象最重要的概念就是类(Class)和实例(Instance),必须牢记类是抽象的模板,比如 Student 类,而实例是根据类创建出来的一个个具体的“对象”,每个对象都拥有相同的方法,但各自的数据可能不同。
class 关键字来定义类。定义好后就可以创建实例,然后后自由的给一个实例变量绑定属性。
因为类可以起到模板的作用,所以在创建实例的时候,可以绑定一些必要的属性。用__init__方法。
class Student(object):
def __init__(self, name, score):
self.name = name
self.score = score
注意到__init__方法的第一个参数永远是 self,表示创建的实例本身,因此,在__init__方法内部,就可以把各种属性绑定到 self,因为 self 就指向创建的实例本身。
数据封装
访问实例的数据的时候,因为数据本身就属于实例,所以就不需要外部数据去访问。在类的内部定义好这些访问数据的函数,就可以“封装”数据了——类的方法。
class Student(object):
def __init__(self, name, score):
self.name = name
self.score = score
def print_score(self):
print(‘%s: %s’ % (self.name, self.score))
bart = Student()
bart.print_score() #自带的函数,调用的时候很方便,不需要知道内部数据的定义
访问限制
为了让内部属性不被外部访问,就在属性的名称前__(2 个下划线),然后就变成了私有变量。
class Student(object):
def __init__(self, name, score):
self.__name = name
self.__score = score
def print_score(self):
print(‘%s: %s’ % (self.__name, self.__score))
这样外部就不能访问__name 和__score 了,因为外部代码不能随意修改对象内部的状态,代码健壮多啦!如果涉及到需要外部代码修改或者访问私有变量的话,可以在类里面增加方法。这样在传参之前可以先做验证,保证传入的参数可用。
需要注意的是,在 Python 中,变量名类似__xxx__的,也就是以双下划线开头,并且以双下划线结尾的,是特殊变量,特殊变量是可以直接访问的,不是 private 变量。有些时候,你会看到以一个下划线开头的实例变量名,比如_name,这样的实例变量外部是可以访问的,但是,按照约定俗成的规定,当你看到这样的变量时,意思就是,“虽然我可以被访问,但是,请把我视为私有变量,不要随意访问”。
继承与多态
继承就是从现有的类进行继承,被继承的为超类或者父类(Base class、Super class)(也就是爸爸),新的类为子类(Subclass)。
class Animal(object):
def run(self):
print(‘Animal is running….’)
#以下为两个子类
class Dog(Animal):
pass
class Cat(Animal):
pass
当子类和父类都存在相同的方法的时候,子类的方法覆盖了父类的,在代码运行的时候,总是会调用子类的方法,这就是多态。在子类创建实例的时候,不仅具备了子类的数据类型,同样也继承了父类的数据类型,所以子类的实例可能存在多个数据类型。但反过来的规则则不成立。
对于一个变量,我们只需要知道它是 Animal 类型,无需确切地知道它的子类型,就可以放心地调用 run() 方法,而具体调用的 run() 方法是作用在 Animal、Dog、Cat 还是 Tortoise 对象上,由运行时该对象的确切类型决定,这就是多态真正的威力:调用方只管调用,不管细节,而当我们新增一种 Animal 的子类时,只要确保 run() 方法编写正确,不用管原来的代码是如何调用的。这就是著名的“开闭”原则:对扩展开放:允许新增 Animal 子类;对修改封闭:不需要修改依赖 Animal 类型的 run_twice() 等函数。
静态语言 vs 动态语言
动态语言的“鸭子类型”。静态语言不限制传入的类型,只需要保证传入的对象有相应的方法即可。Python 的“file-like object“就是一种鸭子类型。这个还蛮特别的 …(碎碎念)
获取对象信息
emmm…. 再次对标题陷入沉思了解对象是什么类型,有哪些方法的操作
使用 type()
基本类型都可以用 type() 来判断,包括变量指向函数或者类。type() 函数返回对应的 Class 类型。
使用 isinstance()
能用 type() 判断的基本类型也可以用 isinstance() 判断, 并且还可以判断一个变量是否是某些类型中的一种。
使用 dir()
如果要获得一个对象的所有属性和方法,可以使用 dir() 函数,它返回一个包含字符串的 list。
祝大家新年快乐~~