面向对象第二讲

绑定给类的方法(@classmethod)

"""
需求:
   要调用类生成一个对象,要求用对象调用类中的一个方法实现实例化出一个类,且从配置文件读ip和port
   
适用场景:
    造一个方法,不能让对象调用,要让类来调用这个方法
    会把类当作第一个参数传递
"""
=====================第一版===================
class Mysql():
    def __init__(self, ip, port):
        self.ip = ip
        self.port = port

    def func_info(self):
        print(self.ip, self.port)

    def from_conf(self): # 实例化的方法
        obj = Mysql(settings.IP, settings.PORT)
        return obj
obj = Mysql('127.0.0.1', 80)
obj1 = obj.from_conf()
obj1.func_info()

=====================第二版===================
class Mysql():
    def __init__(self, ip, port):
        self.ip = ip
        self.port = port

    def func_info(self):
        print(self.ip, self.port)

    def from_conf(self):
        obj = self.__class__(settings.IP, settings.PORT)    # 这里写活了
        return obj
obj = Mysql('127.0.0.1', 80)
obj1 = obj.from_conf()
obj1.func_info()

====================第三版=====================
import settings
class Mysql():
    def __init__(self, ip, port):
        self.ip = ip
        self.port = port

    def tell_info(self):
        print(self.ip, self.port)
    @classmethod
    def from_conf(cls):
        obj = cls(settings.IP, settings.PORT)  # obj = self.__class__(settings.IP, settings.PORT)
        return obj
    # 默认把类名当作第一个参数传递
obj = Mysql.from_conf()
obj.tell_info()

非绑定方法(@staticmethod)

import uuid
class Student():
    def __init__(self,name):
        self.name = name

    @staticmethod
    def get_uuid():
        return uuid.uuid1()

obj = Student('egon')
print(obj.get_uuid())
print(Student.get_uuid())


"""
这里说一下uuid,这个模块可以生成一个随机的不重复的字符串,,详细看我的博客模块一节

这里用装饰器 @staticmethod,生成了一个既不绑定给类,也不绑定给对象的方法
生成的其实就是一个普通函数,需要几个参数就要传几个参数,
类和对象都可以调用这个函数
"""

绑定给对象的

类里面的方法默认都是绑定给对象的

隐藏属性

"""
在类的定义阶段,在语法上做了一个变形
隐藏属性就是把一些数据隐藏起来,不让外面随意修改删除,包括函数也是一样的,可以更好的对外部做限制
外部想要访问,只能给外部提供一个访问的接口, 对外不对内
"""
class Student():
    __school = 'SH'        #'_Student__school'
    def __init__(self, name):
        self.__name = name  # _Student__name

    def __func(self):         # _Student__func
        print('123')

    def get_name(self):       # 给外部的访问提供一个接口
        print(self.__name)
    
    def set_name(self, v):
        self.name = v
    

property装饰器

class Student():
    __school = 'SH'
    def __init__(self, name):
        self.__name = name

    @property
    def name(self):
        print(self.__name)

    @name.setter           # 注意,name加了property装饰器之后,下面的修改就要是name.setter
    def name(self, v):
        self.__name = v
    @name.deleter
    def name(self):
        pass
stu1 = Student('egon')
stu1.name
stu1.name = 'qqq'
stu1.name

继承

面向对象的三大特征:
    1.继承
    2.封装
    3.多态
什么是继承:
   继承就是子承父业
   新建的类叫子类或者派生类,被继承的类叫父类或者基类
为什么用继承:
	解决了类与类之间的代码冗余
python支持多继承
经典类:没有继承了object的类
新式类:继承了object的类
python3以后都是新式类,python2区分经典类和新式类


class People():
    school = 'SH'

    def __init__(self, name, age, gender):
        self.name = name
        self.age = age
        self.gender = gender

class Student(People):
    def __init__(self, name, age, gender, course=None):
        if course is None:
            self.courses = []
        People.__init__(self, name, age, gender)

    def choose_course(self, course):
        self.courses.append(course)
        print("%s 选课成功 %s" % (self.name, self.courses))


class Teacher(People):
    def __init__(self, name, age, gender, level):
        People.__init__(self, name, age, gender)
        self.level = level

    def score(self, stu_obj, num):
        stu_obj.num = num
        print("%s老师给%s打了%s分" % (self.name, stu_obj.name, num))
        
  """
  子类是如何使用父类的属性:
  	1.指名道姓的去使用,没用用继承
  	2.super()必须依赖继承
  """
# 上面是指名道姓的

# super()

class People():
    school = 'SH'

    def __init__(self, name, age, gender):
        self.name = name
        self.age = age
        self.gender = gender

class Student(People):
    def __init__(self, name, age, gender, course=None):
        if course is None:
            self.courses = []
        super().__init__(name, age, gender)

    def choose_course(self, course):
        self.courses.append(course)
        print("%s 选课成功 %s" % (self.name, self.courses))

    def get_info(self):
        print(self.name, self.age, self.gender)


obj = Student('egon', 19, 'male')
obj.get_info()