python-面向对象-类
面向过程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总是指调用时的类的实例。