Python Day24

类属性与对象属性:

类中应该仅存储所有对象共有的内容:如所有人的国籍相同那就放到类中

对象中存储每个对象独有的内容:如每个人的名字都不同

 

init方法的使用:

init 是初始化的缩写,用于为对象的属性设置初始值

特点:

执行时机,当实例化产生对象时会自动执行该函数

会自动传入需要初始化的对象

初始化必须包含至少一个参数,用于表示对象本身

该函数不允许有返回值 必须为None

绑定方法

绑定即两个东西绑在一起

方法就是函数

那就是说绑定方法 == 绑定函数

默认情况下, 在类中定义的方法 都是绑定方法

绑定方法 是把函数和对象绑定到一起

为什么要绑定:

每个应用程序其实本质上都是在处理数据,那就必须明确 要处理的数据在哪里,如何处理

绑定方法的好处在于,将需要处理的数据以及处理数据的方法绑定在一起,这样一来,当你获得一个对象就同时获得数据以及相应的处理方法,简单的调用即可

绑定方法与普通函数的区别:

当使用类调用时,就是一个普通函数,有几个参数就得传几个参数

当使用对象来调用时,是一个绑定方法了,会自动将对象作为第一个参数

一个类中可以有属性和方法

方法分为两种:

1绑定方法:

   1.1对象绑定方法:在使用对象调用时会自动传入对象

   1.2类绑定方法: @classmethod , 在使用对象调用时会自动传入类本身,在使用类来调用时也会自动传入类本身,单例模式中就会经常使用@classmethod

到底绑定给谁:

当你的方法执行过程中需要使用到对象中数据时就绑定给对象

当你的方法执行过程中需要使用到类中数据时就绑定给类

2.非绑定方法

即不需要对象中的数据,也不需要类中的数据,那就定义为非绑定方法,就是普通函数

@staticmethod

oop知识点:

1.属性应该放在类中还是对象中

2.绑定方法 == 绑定函数

对象绑定方法

对象调用时 自动传入对象本身

类调用时不会自动传参 有几个就需要传几个

类绑定方法

@classmethod

无论是对象还是类调用 都会自动传入类本身

非绑定方法(静态方法)

@staticmethod

谁调用都不会自动传参

在使用面向对象编程时,首先要想的是需要什么对象,这些对象具备什么样的属性和什么样的行为,根据属性和行为创建对应的类

 

继承:

class Teacher:
school = "oldboy"
def __init__(self,name,age):
self.name = name
self.age = age

def say_hi(self):
print("hello i am %s" % self.name)

def teach(self):
print("正在教书......")

class Student(Teacher):
pass

print(Student.school)
print(Student.say_hi)
print(Teacher.say_hi)

s = Student("rose","123")
s.say_hi()
s.teach()

在上述案例中通过继承 学生就拥有了老师的所有内容 但是学生不应该教书这个技能
意味着这个继承关系 有问题 不合理
需要先抽象 在继承

抽与继承

继承之后可以直接使用父类的属性和方法

使用继承时 应该先抽象 在继承

抽象指的是 将一系列类中相同的特征和相同行为抽取 形成一个新的类

会产生一些与原本业务不想关的类

站在不同角度会得到不同的抽象结果

 

# 抽象得到的公共父类
class OldBoyPerson:
school = "oldboy"
def __init__(self,name,age):
self.name = name
self.age = age

def say_hi(self):
print("hello i am %s" % self.name)

class Teacher(OldBoyPerson):
def teach(self):
print("正在教书......")


class Student(OldBoyPerson):
pass


# 测试
t = Teacher("owen",38)
t.say_hi()
t.teach()

s = Student("歌王",20)
s.say_hi()

在python3中任何类都直接或间接继承Object

Object是所有类的基类(根类)

其中提供一系列方法,这样一来,无论你是什么类,你都可以直接是object中已经存在的方法

一切的皆对象

一切皆对象指的是在python中您所使用到的任何数据都是对象,int float,list,dict 模块,包,函数

 

属性的查找顺序

对象自己 - > 所在的类 -> 所在类的父类 -> 父类的父类  -> object

派生与覆盖

子类拥有与父类不同的内容就称之为派生类

覆盖指的是子类出现了与父类完全相同(属性/方法)名称,根据查找顺序就会优先找子类的,即覆盖了父类的内容

在子类中访问父类已有的方法或属性

class Person:
text = "321"
def __init__(self,name,age,gender):
self.name = name
self.age = age
self.gender = gender

def sleep(self):
print("人类 午睡 躺着睡!")

def say_hi(self):
print("my name :%s my age :%s my gender: %s " % (self.name,self.age,self.gender),end="")


class Student(Person):
text = "123"
def __init__(self,name,age,gender,number):

重点:

由于父类已经存在一个方法可以完成这个三参数的初始化

所以可以直接调用父类的初始化完成这部分的初始化工作

方法1:Person.__init__(self,name,age,gender) # 指名道姓的调用

方法2:super()。__init__()

# 访问父类的属性
def show_text(self):
print(self.text)
print(super().text)

def say_hi(self):
super().say_hi()
print("my number: %s" % self.number)
# print("my name :%s my age :%s my gender: %s my number: %s" % (self.name, self.age, self.gender,self.number))


s = Student("jack",20,"man","007")
s.say_hi()
# s.show_text()

 

转载于:https://www.cnblogs.com/xinfan1/p/10877656.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值