day24
类属性与对象属性
1.当修改某一个对象的属性时,不会影响其他对象和类
2.类中应该仅存存储所有对象都相同的内容,如果对象的属性不同,则放在对象自己的名称空间中
class Student:
school = ' oldboy'
def act(self):
print('正在学习')
stu1 = Student()
stu1.name = 'Zwj'
stu1.age = 17
stu2 = Student()
stu2.name = 'Zcs'
stu2.age = 20
#封装一下
def my_init(stu,name,age):
stu.name = name
stu.age = age
stu1 = Student()
stu2 = Student()
my_init(stu1,'Zwj',17)
my_init(stu2,'Zcs',20)
#_init方法的使用
class Dog:
#执行时机:当实例化产生对象时会自动执行该函数
#会自动传入需要初始化的对象
#初始化必须包含至少一个对象本身
#该函数不允许有返回值
def __init__(self,age,name):
ge =age
self.name = name
#d = Dog() 等价于Dog.__init__(d)
d1 = Dog(1,'小花')
d2 = Dog(2,'大花')
print(d1.name) 小花
print(d2.name) 大花
print(d1.name) 1
print(d2.name) 2
绑定方法
1.绑定方法 是把函数和对象绑定到一起
2.为什么要绑定:
每个应用程序其实本质上都是在处理数据,那就必须明确 要处理的数据在哪里,如何处理.
3.绑定方法的好处在于,将需要处理的数据以及处理数据的方法绑定在一起,这样一来,当你获得一个对象就同时获得数据以及相应的处理方法 ,简单的调用即可.
当使用类调用时,就是一个普通函数 有几个参数就得传几个参数
当用对象来调用时,是一个绑定方法了,会自动将对象作为第一个参数传入
5.
方法分为两种
1.绑定方法
在使用对象调用时会自动传入对象本身
1.2类绑定方法
@classmethod
在使用对象调用时会自动传入类本身
在使用类来调用时也会自动传入类本身
单例模式中就会经常使用@classmethod
6.
非绑定方法
即不需要对象中的数据 也不需要类中的数据 那就定义为非绑定方法,就是普通函数
@staticmethod
import json
class Student:
school = ' oldboy'
def __init__(self,name,gender,age,cls_name):
self.name = name
self.age = age
self.gender = gender
self.cls_game = cls_name
#将对象的数据序列化到文件中
def save(self):
with open('self.name','wt',encoding = 'utf-8') as f:
json.dump(self.__init__,f)
stu = Student('Hu','man',20,'py20')
stu.save()
@classmethod
def get_obj(name):
with open(name,'rt',encoding = 'utf-8') as f:
dic = json.load(f)
stu = Student(**dic)
return stu
stu = Student.get_obj ('Hu') #拿到对象
print(stu.name) Hu
print(stu.age) 20
继承
在OOP中 继承描述是类和类之间的关系 例如b类继承a类 b类可以直接使用a类中的属性和方法
a是父类(基类,超类) b是子类(派生类)
好处:极大的提高了代码的复用性
school = "oldboy"
def __init__(self,name,age):
self.name = name
self.age = age
print("hello i am %s" % self.name)
def teach(self):
print("正在教书......")
pass
print(Student.say_hi)
print(Teacher.say_hi)
s.say_hi()
s.teach()
#抽象指的是 将一系列类中相同的特征和相同行为抽取 形成一个新的类
会产生一些与原本业务不想关的类
站在不同角度会得到不同的抽象结果
#使用继承时应先抽象再继承
#在py3中任何类都直接或间接继承自object
无论任何类,都可以直接是object中已存在的方法
派生
当一个类继承自另一个类,并且这个字类拥有与父类不同的内容
class A:
def show_info(self):
print('1')
classB(A):
a = 1
pass
#覆盖:子类中出现了与父类名称相同的属性或函数,就会覆盖掉前面的
class A:
def show_info(self):
print('你好')
class B(A):
def show_info(self):
print('你有毒')
pass
text = "321"
def __init__(self,name,age,gender):
self.name = name
self.age = age
self.gender = gender
print("人类 午睡 躺着睡!")
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) # 指名道姓的调用
super().__init__(name,age,gender)
# super(Student, self).__init__(name,age,gender)
self.number = number
#======================================================================
def show_text(self):
print(self.text)
print(super().text)
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()

浙公网安备 33010602011771号