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对象,但只有第一次输出了"吃了吗"。
不知道你这个问题是否已经解决, 如果还没有解决的话:列表:
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 等修改列表的方法没有返回值。
通常我们在类的外部直接调用类的属性和方法,是因为它们在类的定义时已经被创建并赋值,类就像一个命名空间,它们可以在类定义外部任何地方访问。同时我们可以在类中直接写语句而不用在函数中定义,但这些语句是在类定义时执行的,并非在对象实例化时执行,这些语句一般用于给类定义一些静态的属性或者是对类做一些初始化的工作。
代码示例:
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框架避免这些问题的产生。