面向过程 Vs 面向对象
面向过程的程序设计的核心是过程 (流水线式思维), 过程即解决问题的步骤.
优点是: 极大的降低了写程序的复杂度, 只需要顺着要执行的步骤, 堆叠代码即可.
缺点是: 一套流水线或者流程就是用来解决一个问题, 代码牵一发而动全身.
应用场景: 一旦完成基本很少改变的场景, 著名的例子有 Linux 內核, Git, 以及 Apache HTTP Server 等.
面向对象的程序设计的
优点是: 解决了程序的扩展性. 对某一个对象单独修改, 会立刻反映到整个体系中, 如对游戏中一个人物参数的特征和技能修改都很容易.
缺点: 可控性差, 无法向面向过程的程序设计流水线式的可以很精准的预测问题的处理流程与结果, 面向对象的程序一旦开始就由对象之间的交互解决问题, 即便是上帝也无法预测最终结果
应用场景: 需求经常变化的软件, 一般需求的变化都集中在用户层, 互联网应用, 企业内部软件, 游戏等都是面向对象的程序设计大显身手的好地方.
类
类的声明
- # 声明类
- '''
- class 类名:
- pass
- '''
- # 定义一个空类
- class test:
- pass
类的属性引用和实例化
- class Person: # 创建一个 Person 类
- def __init__(self, name, age, sex): # 人的属性: 名字, 年龄, 性别
- self.name = name
- self.age = age
- self.sex = sex
- def eat(self): # 创建人吃的方法
- print("吃的好饱呀!")
- person = Person("Tom", 23, "male") # 创建一个人的对象
- print(person.name) # 访问人的属性 name Tom
- print(person.age) # 访问人的属性 age 23
- person.eat() # 引用人的吃的方法, 这里不是调用 # 吃的好饱呀!
实例化: 类名加括号就是实例化, 会自动触发__init__函数的运行, 可以用它来为每个实例定制自己的特征
查看类变量的属性
- class Test:
- var = 1000
- var1 = 'abc'
- var2 = [(1,2),(3,4)]
- # 查看类当中的变量, 方法一
- print(Test.__dict__["var"]) # 1000
- print(Test.__dict__["var1"]) # abc
- print(Test.__dict__["var2"]) # [(1, 2), (3, 4)]
- # 方式二
- print(Test.var) # 1000
- print(Test.var1) # abc
- print(Test.var2) # [(1, 2), (3, 4)]
类的属性等问题
- class Person:
- def __init__(self, name, age,sex):
- self.name = name
- self.age = age
- self.__dict__['sex'] = sex # 也可以这样创建
- # self 啥
- print(self) # <__main__.Person object at 0x0000018AC95FF0F0> 是类实例对象的本身 不是类本身
- # self.__dict__是啥 是一个字典 是类的属性
- print(self.__dict__) # {'name': 'Tom', 'age': 23, 'sex': 'male'}
- p = Person("Tom",23, 'male')
- print(p) # <__main__.Person object at 0x000001845323F0F0> 可也看见 self 就是类实例对象 p
- print(p.sex) # male
- # 类中的方法第一个参数一定要是 self
- # 类中带 self 的参数都是实例的, 实例对这个参数拥有所有权, 即实例中所有的方法都可以使用实例的参数.
self 能否改变
- class Person:
- def __init__(repalce_self, name, age,sex):
- repalce_self.name = name
- repalce_self.age = age
- repalce_self.__dict__['sex'] = sex # 也可以这样创建
- def test(replace_self):
- print("替换了 self, 哈哈哈!")
- p = Person("Tom", 23, "male")
- print(p.__dict__) # {'name': 'Tom', 'age': 23, 'sex': 'male'}
- p.test() # 替换了 self, 哈哈哈!
self 并不是不能被改变的, 可以被替换, 但是一般都会沿用 self, 当你将其换成其他的, 别人可能就不认识了
总结
self 在定义时需要定义, 但是在调用时会自动传入.
self 的名字并不是规定死的, 但是最好还是按照约定是用 self
self 总是指调用时的类的实例.
来源: http://www.bubuko.com/infodetail-3144159.html