首页 > 其他分享 >面向对象之绑定方法,非绑定方法,隐藏属性,property装饰器,三大特征

面向对象之绑定方法,非绑定方法,隐藏属性,property装饰器,三大特征

时间:2023-06-28 20:55:53浏览次数:38  
标签:__ country self 绑定 stu Student print property 三大

绑定方法

# 绑定给类的方法
# 绑定给对象的方法
class Student():
    school = 'SH'

    def __init__(self, name, age, gender):
        # self:对象自己
        self.name = name
        self.age = age
        self.gender = gender

    # 这个就是绑定给对象的方法,有什么特殊之处?1. 函数的第一个形参self是对象自己,
    # 2. 绑定给对象的方法就有对象来调用,它会把对象自己当成第一个参数传给方法的第一个形参self
    def tell_info(self):
        # self:也是对象自己
        print("name:%s, age:%s, gender:%s" % (self.name, self.age, self.gender))

stu = Student('kevin', 18, 'male')
# stu.tell_info() # stu.tell_info(stu) # name:kevin, age:18, gender:male
"""绑定给对象的方法目的不是想让类来调用的,但是,类也能调用,只不过方法里面有几个参数就要传几个参数"""
Student.tell_info(stu)

绑定给类的方法

# ip:127.0.0.1 port:3306 ====> ip+port可以唯一确定一台计算机上的一款软件
class Oracle():
    def __init__(self, ip, port):
        self.ip = ip
        self.port = port

    @classmethod  # 该方法已经变成了绑定给类的方法,而不是绑定给对象了
    def from_func(cls):
        # self:就是类名
        print("from func")
        # return Oracle(settings.IP, settings.PORT)
        return cls(settings.IP, settings.PORT)


obj = Oracle('127.0.0.1', 3306)
# print(obj.ip)
# print(obj.port)

# res=obj.from_func()

# Oracle.from_func(Oracle)
res=Oracle.from_func() # from func  绑定给类的方法就有类来调用,特殊之处就是:会把类名当成第一个参数传给方法的第一个形参
print(res)

非绑定方法

# 言外之意就是不绑定给类使用,也不绑定给对象使用
# 静态方法:static
# 补充:uuid
# import uuid
# """只要随机串的长度一定,理论上,只要次数足够多,就一定会出现重复的可能"""
# print(uuid.uuid4())  # 65f1ff6b-dd39-441a-8788-0dfde07d6922

# 订单号中一定不能重复,如何保证订单号的不重复


class Student():
    def __init__(self, name, age, gender):
        self.name = name
        self.age = age
        self.gender = gender
        # self.id = self.create_id()
        self.id = self.get_code(5)

    @staticmethod  # 该方法已经谁都不绑定,谁都能来调用,类和对象都可以直接来调用,其实就是个普通方法
    def create_id():
        import uuid
        return uuid.uuid4()

    """什么时候使用静态方法:一般就是方法里面既不用对象,也不用类的时候就使用静态方法"""
    @staticmethod
    def get_code(n):
        code = ''
        import random
        for i in range(n):
            random_int = str(random.randint(0, 9))
            random_upper = chr(random.randint(65, 90))
            random_lower = chr(random.randint(97, 122))
            # temp = random.choice(random_int,random_upper,random_lower)
            # temp = random.choice[random_int,random_upper,random_lower]
            temp = random.choice([random_int, random_upper, random_lower])
            code += temp
        return code

    """如果说方法里面及用到了对象,又用到了类,方法绑定给谁更合适?"""
    def func(self):
        print(self)
        print(self.__class__.__name__)


stu = Student('kevin', 19, 'female')
# stu1 = Student('kevin1', 19, 'female')
# print(stu.id)
# print(stu1.id)

隐藏属性

1. 如何隐藏?
2. 为什么隐藏?
"""
    1. 隐藏属性在类的定义阶段,发生了变形,_类名__属性名
    2. 不但可以隐藏类属性、方法、对象的属性都可以隐藏
    3. 隐藏属性对外不对内,对类的外部是隐藏的,而对类的内部是开放的
"""

1. 如何隐藏

class Student():
    # '_Student__school': 'SH' _类名__属性名: 'SH'
    # school = 'SH'  # 把school属性已经隐藏了,隐藏的意思是,在类外部不能使用了
    __country = 'China'
    def __init__(self, name, age, gender):
        self.__name = name  # _Student__name
        self.age = age
        self.gender = gender

    def __func(self):  # _Student__func  _类名__函数名
        print('from func')

    # def index(self):
    #     return self.__school  # self._Student__school

    def get_country(self):
        return self.__country


    def set_country(self, v):
        if type(v) is not str:
            return
        Student.__country = v

stu = Student('kevin', 19, 'male')
# print(stu.__school)

# 查看类的名称空间
# print(Student.__dict__)
# print(stu.__school)
# 变形之后的数据目的不是想让我们在外部使用的, 但是在类的外部也能使用
# print(stu._Student__school)  # SH

# stu._Student__func()

# print(stu.name)
# print(stu._Student__name)

# res=stu.index()
# print(res)  # SH

############2. 为什么要隐藏?
"""由于隐藏属性是对外不对内的,所以,我们要想在类的外部使用,就需要在类的内部开放一个接口,返回隐藏属性的值,以便更好的对外做限制"""
# print(stu.school)

# Student.school = 'beijing'
# Student.school = 123
# print(stu.school)

# Student.country = 123

# stu.set_country('Japan')
stu.set_country(123)
print(stu.get_country())

property装饰器

作用:就是把方法伪装成属性来使用!

1. 如何隐藏

方式1:

# class Student():
#     __country = 'China'
#     __city = 'shanghai'
#
#     def __init__(self, name, age, gender):
#         self.__name = name  # _Student__name
#         self.age = age
#         self.gender = gender
#
#     @property
#     def country(self):
#         return self.__country
#
#     @country.setter
#     def country(self, v):
#         if type(v) is not str:
#             return
#         Student.__country = v
#
#     @country.deleter
#     def country(self):
#         print("可以删除了")
#         del Student.__country

    # @property
    # def city(self):
    #     return self.__city
    #
    # @city.setter
    # def city(self, v):
    #     Student.__city = v
    #
    # @city.deleter
    # def city(self):
    #     print("可以删除了")
    #     del Student.__city

#
# stu = Student("kevin", 20, 'female')
#
# # print(stu.get_country())
# print(stu.country)
#
# stu.country = 'Japan'
# print(stu.country)

# del Student.country
# stu.set_country('Japan')
# del stu.country


方式2:

class Student():
    __country = 'China'
    __city = 'shanghai'

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

    def get_country(self):
        return self.__country

    def set_country(self, v):
        if type(v) is not str:
            return
        Student.__country = v

    def del_country(self):
        print("可以删除了")
        del Student.__country
    """这种方式,是有顺序要求的"""
    country = property(get_country, set_country, del_country)

stu = Student("kevin", 19, 'male')
print(stu.country)
#
stu.country = 'Japan'
# print(stu.a)
#
del stu.country

实例:

计算人的bmi指数

class Bmi():
    def __init__(self, weight, height):
        self.weight = weight
        self.height = height

    @property
    def bmi(self):
        return self.weight / (self.height ** 2)

bmi = Bmi(70, 1.8)
print(bmi.bmi)

面向对象的三大特征

封装:


也是一种思想,把冗余的代码,重复的代码都封装成函数,以后每次都调用函数来用

继承:

	1. 什么是继承?
    	"""继承就是新建类的一种方式,新建出来的类称为是子类或者叫派生类,被继承的类称为是父类或者叫基类"""
        # 子类可以继承父类的所有属性和方法!
    
    2. 为什么要继承?
    	类解决什么问题:解决的是对象与对象之间的代码冗余问题
        继承解决什么问题:解决的是类与类之间的代码冗余问题
        
    3. 怎么样继承?
    	新式类:继承了object类的子子孙孙类都是新式类
        经典类:没有继承object类的子子孙孙类都是经典类
        
        """只有在python2中才区分经典类和新式类,因为在python3中都是新式类"""
        
    # class Parent1(object):
#     pass
#
# class Parent2:
#     pass
#
# # 直接把类名写在括号里就是继承,括号里面写的类是父类,括号外的是子类
# class Sub1(Parent1):
#     pass
#
#
# # python中支持多继承, 括号里面可以写多个类
# class Sub2(Parent1, Parent2):
#     pass
#
# # 如何查看一个类继承了哪些父类?
# print(Sub1.__bases__)
# print(Sub2.__bases__)
# print(Parent1.__bases__)  # object


以学生选课系统为例

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):
        """这个是指名道姓的调用方法,不依赖于继承"""
        People.__init__(self, name, age, gender) # 有什么特殊之处,
        self.course = course

    def choose_course(self):
        pass

stu = Student('kevin', '19', 'male', 'python')

# 对象属性的查找顺序:先从对象自己的名称空间查找,如果找不到,再去类中取查找,如果找不到,取继承的父类转中查找,
print(stu.school)
print(stu.name)
class Teacher(People):
    def __init__(self,name, age, gender, level):
        People.__init__(self, name, age, gender)  # 有什么特殊之处,
        self.level = level

    def score(self):
        pass


tea = Teacher("ly", 20, 'female', 10)
print(tea.school)

标签:__,country,self,绑定,stu,Student,print,property,三大
From: https://www.cnblogs.com/huangchunfang/p/17512548.html

相关文章

  • 一图讲清楚公众号扫码关注绑定手机号自动登录
    日常开发中,相信不管做C端还是B端业务的同学都会遇到微信相关的业务,比如微信登录、微信支付、公众号扫码关注等场景。最近博主在做公众号扫码关注自动登录这一块的业务,因此总结绘制了一张公众号扫码关注绑定手机号自动登录流程图分享给大家。推荐博主开源的H5商城项目way......
  • Python高阶基础之绑定办法、非绑定方法、隐藏属性、装饰器
    绑定办法'绑定给类的办法''绑定给对象的办法'#绑定给对象classStudent:school='SH'def__init__(self,name,age,gender):self.name=nameself.age=ageself.gender=gender #这个就是绑定给对象的方法,有什么特殊之处?1.......
  • 使用 PDF一机一码加密大师,加密打包PDF文件(一机一码,绑定机器,无需额外安装阅读器)
    PDF一机一码加密大师,可以加密任意PDF文档,添加一机一码授权,静态密码等,可以禁止用户复制,打印PDF文档中的内容,并且加密生成的PDF在其他用户电脑上无需安装第三方阅读器即可直接阅读。 下载地址:点击进入下载页面 特性 1.支持一机一码加密,可以防止PDF文件未授权的分发......
  • .NET Core WEB API中参数的模型绑定方式
    .NETCoreWEBAPI中参数的模型绑定方式有以下几种:参考文献:.NETCoreWEBAPI中接口参数的模型绑定的理解-枫叶456-博客园(cnblogs.com)微软官方说明文档 FromForm:当请求属于表单提交,也就是content-type为application/x-www-form-urlencoded,则必须给参数加上From......
  • java springboot3 Property 'sqlSessionFactory' or 'sqlSessionTemplate' are requir
    老版本的mybatis-plus未适配springboot3解决办法:在pom.xml修改 mybatis-plus-boot-starter版本<dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><vers......
  • 绑定方法与非绑定方法、隐藏属性、property装饰器、面向对象的三大特征
    绑定方法绑定给对象的方法特殊之处:函数的第一个形参self就是对象自己。绑定给对象的方法就会有对象来调用,会把对象自己当成第一个参数传给第一个形参self类调用,就需要传参数,方法里面有几个参数就要传几个参数classStudent():school='SH'#类的属性def_......
  • WPF 入门笔记 - 04 - 数据绑定 - 补充内容:资源基础
    宇宙很大,生活更大,也许以后还有缘相见。--三体......
  • 面向对象之对象的三大特性
    一、封装封装是一种将数据和相关方法组合成一个单独的实体的机制。它将数据(属性)和操作数据的方法(方法)封装在一个对象中,并对外部代码隐藏了内部的实现细节。通过封装,对象可以提供一个公共接口,使得外部代码可以通过该接口访问和操作对象的数据,而不需要了解其内部的具体实现。二、......
  • 【源码阅读】1. 配置、VARIABLE与用户PROPERTY
     配置初始化在FE启动时:● Config类ConfField注解标记的静态属性反射出Field存储到内存confFields,作为一个可读取和修改的属性列表(真正的值存储在Config类的静态属性中,反射出Field并存储到confFields只是一个读取和修改指针而已)● 读取配置文件,根据配置文件内容,设置Confi......
  • panel绑定主体错误导致事件无法触发问题记录(尺寸异常)
    代码实例#coding:utf-8#!/usr/bin/envpython#@author:9527importwxclassDelayStatisticalPanel(wx.Panel):'''@function:背景板(BOOK)@By:9527'''def__init__(self,parent):super().__init__(paren......