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

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

时间:2023-06-26 21:25:44浏览次数:44  
标签:__ name country self 绑定 def property age 三大

绑定方法

绑定给对象的方法

特殊之处:函数的第一个形参self就是对象自己。

绑定给对象的方法就会有对象来调用,会把对象自己当成第一个参数传给第一个形参self

类调用,就需要传参数,方法里面有几个参数就要传几个参数

class Student():
    school = 'SH'  # 类的属性
    
    def __init__(self, name, age, gender):
        self.name = name  # self:对象自己
        self.age = age
        self.gender = gender


    # 绑定给对象的方法
    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

绑定给类的方法

绑定给类的方法就由类来调用,特殊之处就是:会把类名当成第一个参数传递给方法的第一个形参。

# 绑定给类的方法
# ip:127.0.0.1 port:3306 ====> ip+port可以唯一确定一台计算机上的一款软件
import settings


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

    @classmethod  # 加了classmethod装饰器,该方法就变成了绑定给类的方法
    def from_func(cls): # self 就可以写成cls, cls就是类名
        print('123')
        return cls(settings.ip,settings.port)


obj = Mysql(settings.ip,settings.port)
res = Mysql.from_func()

非绑定方法

非绑定方法就是:不绑定给类使用,也不绑定给对象使用

又叫:静态绑定(关键字:static)

补充:uuid ,只要了解 uuid4,只要随机串的长度一定,理论上,一定会出现重复的可能性。

import uuid
print(uuid.uuid4())  # d2cf6751-cc90-4238-90dd-8ebfacd6140c

订单号的不重复:uuid+时间戳。

@staticmethod 装饰器该方法已经谁都不绑定,类和对象都可以直接来调用

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

    """什么时候使用静态方法:一般就是方法里面既不用对象,也不用类的时候就使用静态方法"""
    @staticmethod  # 该方法已经谁都不绑定,谁都能来调用。
    def create_id():
        import uuid
        return uuid.uuid4()
stu = Student('hua',18,'male')
print(stu.id) # 打印随机串
l =str(stu.id)[:13] # 切分随机串
print(l.replace('-','')) # 将-去掉

隐藏属性

在属性名前加__前缀,就会实现一个对外隐藏属性的效果。

class Student():
    country = 'China'

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

    def __func(self):
        print('from func')


obj = Student('hua', 18)
print(obj.__dict__) # AttributeError: 'Student' object has no attribute 'name'
print(obj.name, obj.age)  # hua 18

这种隐藏对外不对内,因为__开头的属性会在类定义时发生统一发生变形:_类名__属性名:

这种变形操作只在类定义的时候发生一次,之后的定义的__开头的属性都不会变形

为什么要隐藏?

因为隐藏属性是对外部对内的,当想在外部使用时,需要在类的内部开放一个接口,返回隐藏属性的值,以便更好的对外做限制。

class Student():
    __country = 'China'
    def __init__(self, name, age):
        self.name = name
        self.age = age
    def __func(self):  # _Student__func  _类名__函数名
        print('from func')
    def index(self):
        return self.__country  # self._Student__school

obj = Student('hua', 18)
print(obj.__dict__)  # {'_Student__name': 'hua', '_Student__age': 18}
print(obj.name, obj.age)  # hua 18
obj._Student__func()  # from func
print(obj.index())  # China

property装饰器

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

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.country)
stu.country = 'Japan'
print(stu.country)

del Student.country
stu.country('Japan')
del stu.country
# 方式2

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

    def __init__(self,name,age,gender):
        self.name =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('hua',18,'male')
print(stu.country) # China
stu.country = 'Japan'
print(stu.country) #Japan
del stu.country # 删除

课堂练习

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(50, 1.55)
print(bmi.bmi) # 20.811654526534856

面向对象的三大特征

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

继承:是新建类的一种方式,新建出来的类称为是子类或者叫派生类,被继承的类称为是父类或者叫基类。

多态

子类可以继承基类的所有属性和方法

类解决的问题:对象与对象之间的代码冗余问题

 继承解的问题:类与类之间的代码冗余问题

继承方式:

新式类:继承了object类的子子孙孙类都是新式类
经典类:没有继承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)

 

标签:__,name,country,self,绑定,def,property,age,三大
From: https://www.cnblogs.com/Lucky-Hua/p/17506475.html

相关文章

  • 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......
  • 新建交换机并绑定队列
    新建exchangeName:exchange_approve_carresource_message新建队列Name:clue.approve.carresource.message.queue该队列绑定到exchange_approve_carresource_messageRoutingkey:clue.approve.carresource.message.queue......
  • springboot里的@PropertySource注解介绍
    在SpringBoot中,@PropertySource注解用于加载外部的属性源文件,将其作为配置文件来使用。该注解可以用于标记在Java类上,并指定要加载的属性源文件的位置。使用@PropertySource注解可以很方便地将外部的属性文件加载到Spring的环境中,并可以通过@Value注解或Environ......
  • pybind11绑定类(一)
    一、自定义数据结构-结构体`class_`会创建C++class或struct的绑定。`init()`方法使用类构造函数的参数类型作为模板参数,并包装相应的构造函数;静态成员函数需要使用`class_::def_static`来绑定#include<pybind11/pybind11.h>namespacepy=pybind11;structPet{Pet......
  • 【JS基础】hasOwnProperty 和 isPrototypeOf
    hasOwnProperty检查对象是否含有某个属性,无法检查其原型链上是否含有该属性isPrototypeOf检查一个对象是否存在于另一个对象的原型链上,比如parent.isPrototypeof(child)检查parent对象是否在child对象的原型链上 console.log('--------------------hasOwnProperty--......
  • CVPR最佳论文颁给自动驾驶大模型!中国团队第一单位,近10年三大视觉顶会首例
    前言 这个高光时刻,属于自动驾驶,属于大模型,更是属于中国团队。本文转载自量子位仅用于学术分享,若侵权请联系删除欢迎关注公众号CV技术指南,专注于计算机视觉的技术总结、最新技术跟踪、经典论文解读、CV招聘信息。CV各大方向专栏与各个部署框架最全教程整理【CV技术指南】CV全......
  • 如何将不同类型的Property绑定_使用绑定表达式
    如何将不同类型的Property绑定_使用绑定表达式我们知道,相同的Property可以直接调用bind进行绑定。而不同类型的Property则不能。现在,我想令textProperty和booleanProperty进行绑定:当booleanProperty为true或false时,同步修改textProperty.那么,有何方案?使用......