首页 > 编程语言 >Python高阶基础之绑定办法、非绑定方法、隐藏属性、装饰器

Python高阶基础之绑定办法、非绑定方法、隐藏属性、装饰器

时间:2023-06-27 19:00:56浏览次数:46  
标签:__ name Python gender self 绑定 高阶 age def

绑定办法

'绑定给类的办法'
'绑定给对象的办法'

# 绑定给对象
class Student:
    school = 'SH'

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


stu = Student('kevin', 18, 'female')
# 通过对象可以直接调用
stu.info()  # name:kevin,age:18,gender:female
# 当然也可以通过类来调用,但是绑定给对象不是让类来调用的,不推荐这样调用
Student.info(stu) # name:kevin,age:18,gender:female
"""绑定给对象的方法目的不是想让类来调用的,但是,类也能调用,只不过方法里面有几个参数就要传几个参数"""

# 绑定给类

关键字:'classmethod'
class Myaql:
    def __init__(self, ip, port):
        self.ip = ip
        self.port = port

    @classmethod  # 该方法已经变成了绑定给类的方法,而不是绑定给对象了
    def func(cls):
        print('from>>>>>func')
        return '192.168.101', 8080


obj = Myaql('192.168.101', 8080)
res = Myaql.func()  # from func  绑定给类的方法就有类来调用,特殊之处就是:会把类名当成第一个参数传给方法的第一个形参
print(res)
# from>>>>>func ('192.168.101', 8080)
# 可以直接通过类名来直接调用方法

非绑定方法

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


class Student:
    school = 'SH'

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

    def info(self):
        print(f"name:{self.name},age:{self.age},gender:{self.gender},id:{self.id}")

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


stu = Student('kevin', 18, 'female')
# 对象调用
stu.info() # name:kevin,age:18,gender:female,id:c4e28c76-d4d4-4c80-be7e-cdf201134265
# 类调用
print(Student.id())  # 9037dcb4-ffdb-4456-8b76-7bc603757ffe

"""什么时候使用静态方法:一般就是方法里面既不用对象,也不用类的时候就使用静态方法"""
    @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])
            code += temp
        return code
    
"""如果说方法里面及用到了对象,又用到了类,方法绑定给谁更合适?"""
	'绑定给对象最合适'
    def func(self):
        print(self) # # <__main__.Student object at 0x00000202B404F100> 	
        print(self.__class__.__name__) # # Student

隐藏属性

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

class Student:
    __school = 'SH'

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

    def info(self):
        return self.__school

    def infos(self, v):
        self.__school = v


stu = Student('kevin', 18, 'female')
# print(stu.school) # SH
# 隐藏起来后就没办法从外部直接调用了
"""这时候就需要开一个接口,我们定义了一个info的接口,接收__school的值"""
stu.info()
print(stu.info())  # SH
# 这时候我们就可以拿到被隐藏得值了
"""下面我们有定义了一个Infos的函数,用来修改__school的值"""
stu.infos(1232)
print(stu.info())  # 1232
# 这时候__school的值就被修改为1232了

property装饰器

"""作用:就是把方法伪装成属性来使用!"""
class Student:
    __school = 'SH'

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

    @property
    def count(self):
        return self.__school

    @count.setter
    def count(self, v):
        self.__school = v

    @count.deleter
    def count(self):
        print('删除')


stu = Student('kevin', 18, 'female')
print(stu.count)  # SH
# 查看
stu.count = 'ABS'
print(stu.count)  # ABS
# 修改
del stu.count  # 删除
# 删除

# 方式二

class Student:
    __school = 'SH'

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

    def get_count(self):
        return self.__school

    def set_count(self, v):
        self.__school = v

    def del_count(self):
        print('删除')
        
	"""这种方式,是有顺序要求的"""
    count = property(get_count, set_count, del_count)


stu = Student('kevin', 18, 'female')
print(stu.count)  # SH
# 查看
stu.count = 'ABS'
print(stu.count)  # ABS
# 修改
del stu.count  # 删除
# 删除

# 课堂练习:计算人的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 index(self):
        print(f'{self.name}选择了{self.course}')


stu = Student('kevin', 18, 'female', 'python')
stu.index()  # kevin选择了python
print(stu.school)


# 对象属性的查找顺序:先从对象自己的名称空间查找,如果找不到,再去类中取查找,
# 如果找不到,取继承的父类转中查找,

class Teacher(People):

    def __init__(self, name, age, gender, level):
        """这个是指名道姓的调用方法,不依赖于继承"""
        People.__init__(self, name, age, gender)
        self.level = level


tea = Teacher('tank', 30, 'male', 'IV')
print(tea.name)  # tank


标签:__,name,Python,gender,self,绑定,高阶,age,def
From: https://www.cnblogs.com/chao0308/p/17509713.html

相关文章

  • 使用 PDF一机一码加密大师,加密打包PDF文件(一机一码,绑定机器,无需额外安装阅读器)
    PDF一机一码加密大师,可以加密任意PDF文档,添加一机一码授权,静态密码等,可以禁止用户复制,打印PDF文档中的内容,并且加密生成的PDF在其他用户电脑上无需安装第三方阅读器即可直接阅读。 下载地址:点击进入下载页面 特性 1.支持一机一码加密,可以防止PDF文件未授权的分发......
  • 新书上市 | 数学不好,Python不行,还能入门机器学习吗?
    没错,图灵君又来安利好书了!什么书?机器学习?机器学习的书已经很多了,这本有啥特别的吗?当然有。话说有位日本网友,买了40多本数学和机器学习相关的书,愣是没有学会,直到遇到了这本,那叫一个相见恨晚呐!嗯,你没猜错,就是一本引进日本的书。图灵的老朋友都知道,我们出版了很多日系好书,比如用图搞定......
  • python实现多进程和多线程
    https://blog.csdn.net/weixin_44917390/article/details/119610760创建多进程方法:importmultiprocessingimporttimedefsing():foriinrange(3):print("iamsingooo~")time.sleep(0.5)defdance():foriinrange(3):......
  • jmeter beashell调用python3脚本并获取python输出值
    test3.py代码如下: beashell代码如下:importjava.io.BufferedReader;importjava.io.InputStreamReader;Stringcommand="cmd/cpythonD://个人//test3.py";Runtimert=Runtime.getRuntime();Processpr=rt.exec(command);pr.waitFor();BufferedRead......
  • 14.python-lambda函数
    python-lambda函数lambda基本语法lambda函数的基本语法形式是lambda参数:表达式。lambda函数并不需要函数名,也就是我们所说的“匿名”的含义。这使得我们可以在代码的任何地方快速定义一个函数。下面的代码展示了如何使用lambda函数。add=lambdax,y:x+yprint(add......
  • Python书单,不将就
    经常有小伙伴询问Python的书,哎呀,动力所致,书单来了。9本,涵盖范围蛮大的。Python热持续中,入门计算机首选语言。。。1、《父与子的编程之旅》作者:WarrenSandeCarterSande译者:苏金国易郑超书号:978-7-115-36717-4定价:69.00元开本:16页数:452推荐指数:★★★★★推荐理由:......
  • 图灵Python图书一览表
    {编程入门}1、Python编程:从入门到实践[NEW!]同时使用Python2.X和3.X讲解2、Python基础教程(第2版·修订版)[HOT!]Python2.53、Python语言及其应用[HOT!]Python3.X4、Python编程入门(第3版)Python3.X5、父与子的编程之旅:与小卡特一起学Python[HOT!]Python2.X6、编程导论(Python......
  • Python是一门杰出的语言,值得你去学习
    为什么要将Python作为第一门语言来学习呢,理由有很多,就像《Python编程:从入门到实践》中说的。Python是一种效率极高的语言:相比于众多其他的语言,使用Python编写时,程序包含的代码行更少。Python的语法也有助于创建整洁的代码:相比其他语言,使用Python编写的代码更容易阅读、调试和扩展。......
  • 由Python历史「解密」Python底层逻辑
    一次纯粹的hackingPython的作者,GuidovonRossum,荷兰人。1982年,Guido从阿姆斯特丹大学获得了数学和计算机硕士学位。尽管,他算得上是一位数学家,但他更加享受计算机带来的乐趣,热衷于做任何和编程相关的活儿。80年代,掀起了个人电脑浪潮,但受限于个人电脑配置低,所有的编译器的核心是做优......
  • python基础33 继承、组合
    单继承下的查找循序单继承的意思是一个类只继承一个类classD():passclassC(D):passclassB(C):passclassA(B):pass如何查找继承下的属性和方法呢classFoo():def__f1(self):#_Foo__f1()print("Foo.f1")deff2(self):......