本文主要是介绍python之面向对象,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
对象的独有功能
# 上一篇我们学习了对象的独有数据,现在讲讲对象的独有功能/也称方法
class Person:
school = '蓝翔挖掘机炒菜学校'
def __init__(self, name): # 让对象拥有独有数据的函数一般建议写在公共方法上面
self.name = name
# 让对象拥有独有数据
def eat(self):
print('%s说用挖掘机炒菜真香!!!!'%self.name)
# 对象公共功能 ,但是对象调用的话就会将对象本身当作第一个参数传入,可以当作是对象的独有功能
res1 = Person('summer')
res1.eat() # summer说用挖掘机炒菜真香!!!!
res2 = Person('jaja')
res2.eat() # jaja说用挖掘机炒菜真香!!!
类名直接调用公共功能的话是会报错的,必须要传对应的参数进去
Person.eat() ×
res3 = Person('jason')
Person.eat(res3) # jason说用挖掘机炒菜真香!!!!
动静态方法
# 专门在类体中编写的函数分为三个方法
1.绑定给对象的方法
eg:
class Person:
school = '蓝翔挖掘机炒菜学校'
def stu(self):
# 绑定给对象的方法
print('上课越来越认真了啊!!',self)
res = Person()
res.stu() # 上课越来越认真了啊!!
------------
2.绑定给类的方法
class Person:
school = '蓝翔挖掘机炒菜学校'
def stu(self):
# 绑定给对象的方法
print('上课越来越认真了啊!!',self)
@classmethod # 想让类调用的话需要用这个装饰器
def cooking(cls):
# 绑定给类的方法
print('挖掘机炒菜功能越来越6了')
rea = Person()
Person.cooking() # 挖掘机炒菜功能越来越6了 <class'__main__.Person'>
res = Person()
res.stu() # 上课越来越认真了啊!!
res.cooking() #挖掘机炒菜功能越来越6了 <class '__main__.Person'>
3.普通函数(也是静态方法)
@staticmethod # 需要用装饰器
# 静态方法
def run(a,b):
print('我爱挖掘机')
rea = Person()
Person.run(1,2) # 我爱挖掘机
res = Person()
res.run(1,3) # 我爱挖掘机
动静态方法总结
1.绑定给对象的方法 使用self
直接让对象自身当作第一个参数传入
2.绑定给类的方法 @classmethod 加语法糖
将类名本身当作第一个参数传入
而对象来调用绑定给类的方法时,会自动将产生该对象的类作为第一个参数传入
3.静态方法 @staticmethod 加语法糖
就是函数本身了,调用的时候括号内有几个参数就需要传几个参数,不管是对象还是。
面向对象三大特性之继承
面向对象三大特性分别是:
继承、封装、多态
# 写法
class 类名(类名):
pass
1.定义类的时候在类名后加括号
2.括号内填写你需要继承的类名
3.括号内可以填写多个父类 逗号隔开即可
class C:
house3 = 5
def money3(self):
print('不好好上课回家继承家业')
class person(C): # 定义继承类名的不用写冒号直接写括号加上需要继承的类
pass
print(person.money3)
person.money3(1) # 不好好上课就回家继承家业
# 继承了类体内的所有代码
我们将被继承的类称之为: 父类或基类或超类
eg:上述的c
我们将继承类的类称之为: 子类或派生类
eg:上述类person
ps:平时最常用的就是父类和子类
继承的本质
class people:
def __init__(self, name, age, hobby):
self.name = name
self.age = age
self.hobby = hobby
class teach(people):
pass
class Student(people):
def choice(self):
print('正在选课')
teh = teach('sum',38,'shopping')
print(teh.__dict__) # {'name': 'sum', 'age': 38, 'hobby': 'shopping'}
stu1 = Student('summer',18,'read')
print(stu1.__dict__) # {'name': 'summer', 'age': 18, 'hobby': 'read'}
------------
对象:数据和功能的结合体
类:多个对象相同的数据和功能的结合体
父类:多个类相同的数据和功能的结合体
ps:类和父类最主要的功能其实就是节省代码
数据和方法的查找
不继承查找顺序
先从对象自身查找 没有的话 再去产生该对象的类中查找
class Student():
def choice(self):
print('正在选课')
res = Student()
res.choice() # 正在选课
单继承查找顺序
# 只要涉及到对象查找名字 几乎要回到最开始的位置依次查找
class A1:
def func1(self):
print('from A1 func1')
def func2(self):
print('from A1 func2')
self.func1() # obj.func1()
class MyClass(A1):
def func1(self):
print('from MyClass func1')
obj = MyClass()
obj.func2() # from A1 func2 from MyClass func1
多继承查找顺序
# 继承多类
class A:
house = 10
def money(self):
print('不好好上班就回来继承家业')
class B:
house = 5
def money(self):
print('不好好上学就回来种红薯')
class C:
house = 5
def money(self):
print('不好好上课就回村捡破烂')
class person(A, B, C):
def money(self):
print('好好学习天天向上')
print(person.money)
person.money(1)
# 多继承的话是按照继承的名称从左到右依次查找的
# 如果自己有的话就打印自己的:好好学习天天向上
# 如果自己没有A有的话就继承A:不好好上班就回来继承家业
# 如果A没有的话就继承B:不好好上学就回来种红薯、
# 如果AB都没有的话就继承C:不好好上课就回村捡破烂
ps:我这就是为了更直观的看出继承查找顺序写的类体代码,实际的继承本质是为了节省代码
经典类与新式类
经典类
不继承object或其子类的类(什么都不继承)
# 在python2中 类不加object的话用句点符是点不出class该有的一些方法,必须要加上object才可以调用它的内置方法
python2中需要这么写:
class MyClass(object):
def func1(self):
print('from MyClass func1')
新式类
继承了object或其子类的类
class MyClass(): # 等同于这么写 class MyClass(object)
def func1(self):
print('from MyClass func1')
# 在python3中所有的类默认都会继承object ,也就是说python3里面只有新式类
object里面几乎都是类具备的功能 ,我们在调用class的时候其实是在调用object方法,因为class继承了object
派生方法
子类中定义类与父类一模一样的方法并且扩展了该功能>>>:派生
class people:
def __init__(self, name, age, hobby):
self.name = name
self.age = age
self.hobby = hobby
class teach(people):
def __init__(self,name, age, hobby,job):
super().__init__(name, age, hobby) # 专门用于子类调用父类的方法
self.job = job # 自己再增加想拥有的属性
class Student(people):
def __init__(self,name, age, hobby,score): # 专门用于子类调用父类的方法
super().__init__(name, age, hobby)
self.score = score # # 自己再增加想拥有的属性
这篇关于python之面向对象的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!