Python 基础学习笔记(四)

1 类与面向对象

1.1 类的定义

Python也采用了面向对象的编程思想,也就是“类”,类包括属性和方法两个部分。

举一个通俗的例子,具有相似的特征(属性)和行为方式(方法)的一组对象,我们称为“类”,比如植物类、动物类。

假如我们要新建一个类(名字叫可乐),那我们应尝试描述其特征,比如配方、颜色、味道;并且定义一些方法,比如如何制作可乐、喝可乐会获得能量。如下:

class CocaCola:
    formula = ['caffeine', 'sugar', 'water', 'soda']
    def drink(self):
        print('Energy!')

1.2 类的实例

类其实是对某一类对象的抽象描述,也就是只有神而没有形。实例化之后,才会产生实体。以可口可乐为例,类只是对它的抽象描述,而实例化才是按照这个描述生产的一瓶可以喝的可乐。

由于类的属性会被所有类的实例所共享,所以值是完全一样的。

class CocaCola:
    formula = ['caffeine', 'sugar', 'water', 'soda']
    def drink(self):
        print('Energy!')

coke_for_me = CocaCola()
coke_for_you = CocaCola()

print(CocaCola.formula)             #类的属性
print(coke_for_me.formula)          
print(coke_for_me.formula)          

# 运行结果
# ['caffeine', 'sugar', 'water', 'soda']
# ['caffeine', 'sugar', 'water', 'soda']
# ['caffeine', 'sugar', 'water', 'soda']

类的属性和正常变量无区别,如下:

for element in coke_for_you.formula:
    print(element)

# 运行结果
# caffeine
# sugar
# water
# soda

1.3 实例属性

中国的可口可乐,应该是同样的配方,但名称应该是特有的中文,这种独有的本地化调整,我们可以通过改变特定实例的属性实现。但这种改变,并不会影响到可口可乐类。

 class CocaCola:
    formula = ['caffeine', 'sugar', 'water', 'soda']
    def drink(self):
        print('Energy!')

coke_for_China = CocaCola()
coke_for_China.local_logo = '可口可乐'

print(coke_for_China.local_logo)             #实例的属性

# 运行结果
# 可口可乐

1.4 实例方法

1.4.1 self 参数

self 指的是被创建的实例本身。这里是将一个对象作为参数放入函数括号内。

class CocaCola:
    formula = ['caffeine', 'sugar', 'water', 'soda']
    def drink(self):
        print('Energy!')

coke = CocaCola()
coke.drink()

# 运行结果
# Energy!

1.4.2 更多参数

class CocaCola:
    formula = ['caffeine', 'sugar', 'water', 'soda']
    def drink(self, how_much):
        if how_much == 'a sip':
            print('Cool~')
        elif how_much == 'Whole bottle':
            print('Headache!')

ice_coke = CocaCola()
ice_coke.drink('a sip')

# 运行结果
# Cool~

1.5 __init__( ) 方法

如果类中定义了此方法,那么在创建实例的时候可以自动处理很多事情,如新增加实例属性。

并且不需要单独调用此方法,创建实例此方法自动执行。

这类方法的参数和普通函数的参数一样,可以有多个。

class CocaCola:
    formula = ['caffeine', 'sugar', 'water', 'soda']
    def __init__(self, local_name):                   #多个参数
        self.local_logo = local_name                  #实例的属性

        for element in self.formula:                  #init的更多可以做的事情~
            print('Coke has {}!'.format(element))

    def drink(self, how_much):
        if how_much == 'a sip':
            print('Cool~')
        elif how_much == 'Whole bottle':
            print('Headache!')

ice_coke = CocaCola('可口可乐')

# 运行结果
# Coke has caffeine!
# Coke has sugar!
# Coke has water!
# Coke has soda!

1.6 类的继承

无咖啡因的可乐(子类),继承了一般的可乐(父类)。父类中的变量和方法可以完全被子类继承,但如需有特殊的改动也可以进行覆盖

class CocaCola:
    formula = ['caffeine', 'sugar', 'water', 'soda']
    def __init__(self, local_name):
        self.local_logo = local_name#'可口可乐'

        for element in self.formula:
            print('Coke has {}!'.format(element))

    def drink(self, how_much):
        if how_much == 'a sip':
            print('Cool~')
        elif how_much == 'Whole bottle':
            print('Headache!')

class CaffeineFree(CocaCola):
    caffeine = 0

ice_coke = CaffeineFree('可口可乐')
print(ice_coke.caffeine)
# 运行结果
# Coke has caffeine!
# Coke has sugar!
# Coke has water!
# Coke has soda!
# 0

1.7  类的属性 VS 实例的属性

当同名的实例属性和类的属性同时存在时,引用属性的顺序?

 1.8 如何查看类的定义? 

按住ctrl键就可以了啊!!!

2 自定义类并导入库

实践:制作填充用户假数据的小工具。

要求:

1、从两个txt文件中分别读入姓和名。把变量保存在元祖中。为什么不是保存在列表?因为元祖更省内存。

2、将姓和名随机组成姓名。

此处用到random.choice( ) 函数。

3、利用生成器批量生成姓名。

在任意一种循环中使用yield 返回结果,假设有10层循环,那么将返回10个值,并且由于运行结果的保存是基于迭代的方式,所以更省内存空间

访问迭代器内部的值时,需要用for 循环。

2.1 读数据

输入:last_name.txt 存入的名,first_name.txt 存入的姓

# last_name.txt
开心 
天
露
国庆 
改革 
春风 
已


# first_name.txt
赵 
钱 
孙 
李 
周 
吴 
郑 
王

输出:将数据从txt文件中读入列表中

ln_path = 'C:/Users/XuQiong/Desktop/last_name.txt'
fn_path = 'C:/Users/XuQiong/Desktop/first_name.txt'
fn = []
ln1 = []
ln2 = []

with open(fn_path, 'r', encoding='utf-8') as f:
    for line in f.readlines():
        fn.append(line.split('\n')[0])

print(fn)
with open(ln_path, 'r', encoding='utf-8') as f:
    for line in f.readlines():
        if len(line.split('\n')[0]) == 1:
            ln1.append(line.split('\n')[0])
        else:
            ln2.append(line.split('\n')[0])

print(ln1)
print('='*10)  #分割线
print(ln2)


# ['赵 ', '钱 ', '孙 ', '李 ', '周 ', '吴 ', '郑 ', '王']
# ['天', '露', '已']
# ==========
# ['开心 ', '国庆 ', '改革 ', '春风 ']

2.2 随机生成姓名

import random
class FakerUser:
    def fake_name(self, one_word=False, two_words=False):
        if one_word:
            full_name = random.choice(fn) + random.choice(ln1)
        elif two_words:
            full_name = random.choice(fn) + random.choice(ln2)
        else:
            full_name = random.choice(fn) + random.choice(ln1 + ln2)
        print(full_name)
    def fake_gender(self):
        gender = random.choice(['男', '女', '未知'])
        print(gender)

class SnsUser(FakerUser):
    def get_followers(self, few=True, a_lot=False):
        if few:
            followers = random.randrange(1,50)
        elif a_lot:
            followers = random.randrange(200,10000)
        print(followers)

user_a = FakerUser()
user_b = SnsUser()
user_a.fake_name()

2.3 采用迭代器批量生成

import random
class FakerUser:
    def fake_name(self, amount=1, one_word=False, two_words=False):
        n = 0
        while n <= amount:
            if one_word:
                full_name = random.choice(fn) + random.choice(ln1)
            elif two_words:
                full_name = random.choice(fn) + random.choice(ln2)
            else:
                full_name = random.choice(fn) + random.choice(ln1 + ln2)
            yield full_name
            n += 1

    def fake_gender(self, amount=1):
        n = 0
        while n <= amount:
            gender = random.choice(['男', '女', '未知'])
            yield gender
            n += 1


class SnsUser(FakerUser):
    def get_followers(self, amount=1, few=True, a_lot=False):
        n = 0
        while n <= amount:
            if few:
                followers = random.randrange(1,50)
            elif a_lot:
                followers = random.randrange(200,10000)
            yield followers
            n += 1


user_a = FakerUser()
user_b = SnsUser()
for name in user_a.fake_name(30):
    print(name)
for gender in user_a.fake_gender(30):
    print(gender)

猜你喜欢

转载自blog.csdn.net/u014655960/article/details/126270399