Python类的问题


class Person(object):
    def say_hello(self):
        print('打招呼!')


# 定义一个表示中国人的类
class Chinese(Person):
    def say_hello(self):  # 重写方法
        super().say_hello()
    print('吃了吗?')


chinese = Chinese()
chinese.say_hello()

上边Python代码中print('吃了吗?')直接写在了def say_hello(self)的外边,代码也不报错,这是什么原理?这样的话貌似print语句和def定义的函数语句是并列关系了,类里边能直接写print语句?

你写在类外面的
chinese = Chinese()
不也照样执行了吗
对于java来说,所有代码和属性都必须定义在类里,所有需要执行的语句都要写在函数里
而对于python来说,它根本没有块的概念,你可以写在任何地方
只要不写在函数里,它就是个静态代码,只会执行一次
如果你直接写进文件里,那么首次import文件的时候会执行
如果你写进类里,那么首次加载类的时候会执行

是的,python允许这么做,虽然一般来说直接丢在类里面的代码是用来定义类属性的,但是别的代码实际上也可以。

这个相当于类的静态属性,只有在第一次初始化对象的时候才会执行。可以看看下面的例子:

class Person(object):
    def say_hello(self):
        print('打招呼!')
 
 
# 定义一个表示中国人的类
class Chinese(Person):
    def say_hello(self):  # 重写方法
        super().say_hello()
    print('吃了吗?')
 
for i in range(5):
    chinese = Chinese()
    chinese.say_hello()

这里重复了五次构造Chinese对象,但只有第一次输出了"吃了吗"。

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 这个问题的回答你可以参考下: https://ask.csdn.net/questions/7521860
  • 你也可以参考下这篇文章:【python】输入一个正偶数,输出两个素数,并且这两个素数之和等于原来的正偶数。如果存在多组符合条件的素数则全部输出
  • 同时,你还可以查看手册:python- 序列和其他类型的比较 中的内容
  • 除此之外, 这篇博客: python相关知识中的 列表:python中列表是可变的,这是它区别于字符串和元组的最重要的特点,一句话概括即:列表可以修改,而字符串和元组不能。 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:
    列表:
    a = [66.25, 333, 333, 1, 1234.5]
    print(a.count(333), a.count(66.25), a.count('x'))
    结果:2 1 0
    a.reverse()
    结果:[333, 1234.5, 1, 333, -1, 66.25]
    a.sort()
    结果:[-1, 1, 66.25, 333, 333, 1234.5]
    注意:类似 insert, remove 或 sort 等修改列表的方法没有返回值。
    
  • 您还可以看一下 Toby老师的python机器学习-乳腺癌细胞挖掘课程中的 如何创建python虚拟编程环境-避免项目包版本冲突(选修)小节, 巩固相关知识点
  • 以下回答来自chatgpt:

    通常我们在类的外部直接调用类的属性和方法,是因为它们在类的定义时已经被创建并赋值,类就像一个命名空间,它们可以在类定义外部任何地方访问。同时我们可以在类中直接写语句而不用在函数中定义,但这些语句是在类定义时执行的,并非在对象实例化时执行,这些语句一般用于给类定义一些静态的属性或者是对类做一些初始化的工作。

    代码示例:

    class MyClass:
        # 静态属性
        my_attr = "静态属性"
    
        # 语句块
        print("我是类定义中的语句块")
    
        def my_method(self):
            print("方法调用")
    
    print(MyClass.my_attr)  # 直接访问静态属性
    MyClass.my_method()     # 直接调用方法
    

    输出:

    我是类定义中的语句块
    静态属性
    方法调用
    

    对于段落2的问题,代码中读取到的内容以后需要先用strip()将读取到的字符串两侧空格剔除,然后再用split()函数将内容按\n(一行结束的标志)进行分割成列表,接着使用列表的sort()方法进行排序。排序后的内容再以字符串形式输出即可。

    代码示例:

    # 打开文件
    f = open("test.txt")
    # 读取文件的内容,并将两侧的空格去掉
    con = f.read().strip()
    # 将内容按照行分割成列表
    list_file = con.split("\n")
    print("排序前:")
    print("\n".join(list_file))
    # 利用list内置的sort函数
    list_file.sort()
    print("排序后:")
    print("\n".join(list_file))
    

    对于段落5的问题,代码中可以使用try except语句捕获输入的数字是否合法的异常并对其进行处理。使用isnumeric()函数判断输入的数字是否合法,如果不合法,给出错误提示并让用户重新输入。

    代码示例:

    while True:
        score = input("请输入一个数:")
        try:
            score = int(score)
            break
        except ValueError:
            print("输入不合法,请重新输入!")
    print("输入的数是:", score)
    

    对于段落7的问题,代码中使用的是executemany()方法执行批量插入,executemany()的第一个参数是插入语句,第二个参数是一个元组或列表,其中每一个元素是要插入的数据,多个元素就是多行数据。

    代码示例如下:

    import random
    import MySQLdb
    from utils import random_string
    
    conn = MySQLdb.connect(host='localhost', port=3306,
                           user='root', password='******',
                           database='test', charset='utf8')
    try:
        with conn.cursor() as cursor:
            # 准备参数
            params = []
            for i in range(5):
                username = f'user_{i}'
                password = random_string(random.randint(6, 12))
                params.append((username, password))
    
            # 批量插入数据
            cursor.executemany(
                'insert into users (username, password) values (%s, %s)',
                params
            )
    
        # 提交事务
        conn.commit()
    
    except MySQLdb.MySQLError as err:
        # 捕获数据库操作错误
        print('操作失败,错误信息:', err)
        # 事务回滚
        conn.rollback()
    
    finally:
        conn.close()
    

    注意,在实际应用中,插入的数据可能来自于文件上传、网络传输或者是其他客户端提供的数据,我们需要对这些数据进行验证和转换,避免SQL注入等安全问题。可以使用ORM框架避免这些问题的产生。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!
PS:问答VIP年卡 【限时加赠:IT技术图书免费领】,了解详情>>> https://vip.csdn.net/askvip?utm_source=1146287632