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

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

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

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

5.

方法分为两种

1.绑定方法

1.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是子类(派生类)

好处:极大的提高了代码的复用性

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()
 
                   抽象

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

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

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

#使用继承时应先抽象再继承

#在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

 

 

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

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  在py2中不支持
        super().__init__(name,age,gender)
        # py2的写法
        # super(Student, self).__init__(name,age,gender)
        self.number = number
        #======================================================================
    # 访问父类的属性
    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()

 

 

 

 

 

 

 

 

posted @ 2019-05-16 20:26  呼吸决定丶  阅读(81)  评论(0)    收藏  举报