ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

python之面向对象

2022-07-27 23:37:08  阅读:146  来源: 互联网

标签:name python self 面向对象 print class def 继承


对象的独有功能

# 上一篇我们学习了对象的独有数据,现在讲讲对象的独有功能/也称方法
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说用挖掘机炒菜真香!!!!
 

image

动静态方法

# 专门在类体中编写的函数分为三个方法
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:我这就是为了更直观的看出继承查找顺序写的类体代码,实际的继承本质是为了节省代码

image

经典类与新式类

经典类
	不继承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  # # 自己再增加想拥有的属性

标签:name,python,self,面向对象,print,class,def,继承
来源: https://www.cnblogs.com/Hsummer/p/16526950.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有