绑定方法与三大特征

绑定方法

'''
与对象进行绑定
# class Student():
#     country = 'CHINA'
#
#     def __init__(self, name, age):
#         self.name = name
#         self.age = age
#
#     def tell_info(self):
#         print("%s-%s" % (self.name, self.age))
#
#
# obj = Student('egon',  30)
# obj.tell_info()

'''


'''

# 绑定给类的
# ip port

import settings


class Mysql():
    country = 'CHINA'

    def __init__(self, ip, port):
        self.ip = ip
        self.port = port

    def tell_info(self):
        print("%s-%s" % (self.ip, self.port))


    # 类方法是绑定给类的,类来调用, 把类名当做第一个参数传递
    @classmethod
    def from_config(cls):
        # class_name => Mysql
        # obj = self.__class__(settings.IP, settings.PORT)
        obj = cls(settings.IP, settings.PORT)
        return obj

    # def func(self):
        #
        # self
        # self.__class__

obj = Mysql('127.0.0.1', 80)
# obj.tell_info()

# Student.tell_info(obj)
# obj1 = obj.test()
# obj1 = obj.from_config()
# print(obj1.country)
Mysql.from_config()  # Mysql.from_config(Mysql)

'''

非绑定方法

非绑定方法:不绑定给对象,也不绑定给类
    class Mysql():
    def __init__(self, ip, port):
        self.ip = ip
        self.port = port

    @staticmethod # 静态方法
    def create_id(x, y, z):
        import uuid
        print(uuid.uuid4())

obj = Mysql('127.0.0.1',3306)
obj.create_id()

隐藏属性

class People():
    __country = 'CHINA'    # _People__country

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


    def get_name(self):
        return '名字:%s' % self.__country
	
    def set_country(self, v):
         if type(v) is not str:
             print("country必须是str类型")
             return
         self.__country = v
     def del_country(self):
         print("不删除")
    

obj = People('wuc',18)
print(obj.get_name())

property装饰器

将一个函数功能伪装成一个数据属性

class People():
    __country = 'CHINA'  # _People__country

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

	(@property)
    def get_name(self):
        return self.__name
    
	( @name.setter)
    def set_name(self, v):
        if type(v) is not str:
            print("必须是str类型")
            return
        self.__name = v
        
	( @name.deleter)
    def del_name(self):
        print("不能删除")

    # 这样写, 必须按照这个顺序
    xxx = property(get_name, set_name, del_name)


obj = People('ly', 18)

print(obj.xxx)
obj.xxx = 'EGON'
print(obj.xxx)

del  obj.xxx

面向对象的三大特征:

    1.封装
    2.继承
    3.多态
    
1. 什么是继承?
    继承就是一种新建类的方式,  新建的类我们称为字类或者叫派生类, 被继承的类成为父类或者叫基类
    子类可以遗传父类的属性

2. 为什么用继承?
    类是解决对象与对象之间的代码冗余的

    继承是解决类与类之间的代码冗余的

3.如何使用继承?

    python支持多继承

    经典类:没有继承object类的子子孙孙类都是经典类
    新式类:继承了object以及该类的子子孙孙类都是新式类

    python2中才区分新式类和经典类
    python3 中都是新式类
例
# class Parent1:
#     pass


# class Parent2:
#     pass
#
#
# class Sub1(Parent1):
#     pass
#
#
# class Sub2(Parent1, Parent2):
#     pass

# print(Parent1.__base__)
#
# print(Parent2.__base__)

# print(Sub1.__bases__)
# print(Sub2.__bases__)

例
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 = []
            # self => stu1
        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))


stu1 = Student('tom', 19, 'male')
print(stu1.school)
print(stu1.name)
print(stu1.age)

tea1 = Teacher('tom', 19, 'male', 10)
print(tea1.school)
print(tea1.name)
print(tea1.age)
posted @ 2021-07-16 14:37  wuc123  阅读(43)  评论(0)    收藏  举报