Python日记Day_8 类

《Python编程从入门到实践》日记Day_8

第八章 类

类相当于把函数给封装起来,是一组函数。

1.类的好处主要有
方便复用(如果你用函数写,就要复制整块代码,增加了代码量,增加了出错率)
方便扩展(函数写段代码,若要升级、扩展,都十分复杂,容易出错,用类来扩展,则方便清晰)
方便维护(因为类是把抽象的东西映射成我们常见的,摸得到的东西,容易理解,维护也方便)

①创建和使用类

创建

class Dog():
    def __init__(self,name,age):
        self.name = name
        self.age = age
        print(f"My dog's name is {name}, he is {age} years old.", )
    def sit(self):
        print(self.name.title() + " is now sitting.")
    def roll_over(self):
        print(self.name.title() + " rolled over.")
my_dog = Dog("duoduo", 3)
####
Process finished with exit code 0

Python中规定首字母大写的名称指的是类。
方法__init__,Python调用Dog类的时候呢,会自动的引入实参self。每个与类相关联的方法调用时对会传递实参self,他是一个指向实例本身的引用,让实参能够访问类中的属性和方法。

访问、使用

class Dog(): 
	--snip--
my_dog = Dog("duoduo", 3)
a = my_dog.name
print(a)
my_dog.sit()
my_dog.roll_over()
###
My dog's name is duoduo, he is 3 years old.
duoduo
Duoduo is now sitting.
Duoduo rolled over.

可以看到 __init__中的形参self 实际上是帮助了类里面的函数来调用传递过来的实参。这一点和函数一模一样。

class Dog():
    def __init__(self,name,age):
        self.name = name
        self.age = age
    def sit(self):
        print(self.name.title() + " is now sitting.")
    def roll_over(self):
        print(self.name.title() + " rolled over.")

my_dog = Dog("duoduo", 3)
your_dog = Dog("niuniu",2)
print("My dog's name is" + my_dog.name + ", he is "+ str(my_dog.age) +" years old.",)
print("Your dog's name is" + your_dog.name + ", he is "+ str(your_dog.age) +" years old." )
#####
My dog's name isduoduo, he is 3 years old.
Your dog's name isniuniu, he is 2 years old.

②.使用类和实例

给属性指定默认值。在 __init__中完成

class Car():
    def __init__(self, make, model, year):
        self.make = make
        self.model = model
        self.year = year
        self.odometer_reading = 0
    def describe(self):
        L_name = str(self.year) + ' ' + self.make + ' ' + self.model
        return L_name
    def read_odometer(self):
        print(f"This car has {self.odometer_reading} miles on it.")
my_new_car = Car("Audi", "A4", "2019")
print(my_new_car.describe())
my_new_car.read_odometer()
####
2019 Audi A4
This car has 0 miles  on it.

修改属性的值
1.直接修改
顾名思义,修改参数值

class Car():
    def __init__(self, make, model, year):
        self.make = make
        self.model = model
        self.year = year
        self.odometer_reading = 0
    def describe(self):
        L_name = str(self.year) + ' ' + self.make + ' ' + self.model
        return L_name
    def read_odometer(self):
        print(f"This car has {self.odometer_reading} miles on it.")
        
my_new_car = Car("Audi", "A4", "2019")
print(my_new_car.describe())
my_new_car.odometer_reading = 10000
my_new_car.read_odometer()
####
2019 Audi A4
This car has 10000 on it.

2.通过方法修改属性值

在类中定义函数来修改值。

class Car():
    --snip--
    update_odometer(self, mile):
        if mile >= 0:
            self.odometer_reading = mile
        else:
            print("ERROR!")


my_new_car = Car("Audi", "A4", "2019")
print(my_new_car.describe())
my_new_car.update_odometer(151613)
my_new_car.update_odometer(-4151)
my_new_car.read_odometer()
####
2019 Audi A4
ERROR!
This car has 151613 miles on it.

3.通过方法对属性的值进行递增

在类中定义函数来修改值。

class Car():
	--snip--
	def increment_odometer(self, mile):
       		self.odometer_reading += mile

my_new_car = Car("Audi", "A4", "2019")
print(my_new_car.describe())
my_new_car.update_odometer(0)
my_new_car.read_odometer()
my_new_car.increment_odometer(12101)
my_new_car.read_odometer()
####
2019 Audi A4
This car has 0 miles on it.
This car has 12101 miles on it.

③继承

什么时候使用继承:假如我需要定义几个类,而类与类之间有一些公共的属性和方法,这时我就可以把相同的属性和方法作为基类的成员,而特殊的方法及属性则在本类中定义。这样子类只需要继承基类(父类),子类就可以访问到基类(父类)的属性和方法了,它提高了代码的可扩展性和重用行。如:猫,狗 都属于动物,它们行为相似性高,都会叫,会吃,会喝,会拉,会撒娇。

子类继承了其弗雷所有的属性和方法,同时还可以定义自己的属性和方法。

class Car():	
	--snip--
	
class ELectricCar(Car):
    def __init__(self, make, model, year):
        super().__init__(make, model, year)

my_tesla = ELectricCar('tesla', 'model s', 2020)
print(my_tesla.describe())
#####
2020 tesla model s

并且我们可以给子类添加特有的属性和方法

class Car():
	--sinp--

class ELectricCar(Car):
    def __init__(self, make, model, year):
        super().__init__(make, model, year)
        self.battery = 70
    def describe_battery(self):
        print(f"This car has a {self.battery} -KWH battary.")

my_tesla = ELectricCar('tesla', 'model s', 2020)
print(my_tesla.describe())
my_tesla.describe_battery()
####
2020 tesla model s
This car has a 70 -KWH battary.

也可以重写父类的方法。

可在子类中定义这样一个方法,即它与要重写的父类方法同名,这样Python将不会考虑这个父类方法,而只关注你在子类中定义的相应的方法
对于父类的方法,只要它不符合子类模拟的事物的行为,都可进行重写。

def fill_gas_tank(self):
    print(f"There is no gas tank in tesla.")

将实例用作属性

class Car():
	--snip--

class Battery():
    def __init__(self,battery_size = 70):
        self.battery_size = battery_size
    def descirbe_battary(self):
        print(f"This car has a {self.battery_size} -KWH battary.")

class ELectricCar(Car):
    def __init__(self, make, model, year):
        super().__init__(make, model, year)
        self.battery = Battery()

my_tesla = ELectricCar('tesla', 'model s', 2020)
print(my_tesla.describe())
my_tesla.battery.descirbe_battary()
#####
2020 tesla model s
This car has a 70 -KWH battary.

添加新的属性

class Car():
   --snip--

class Battery():
    def __init__(self,battery_size = 70):
        self.battery_size = battery_size
    def descirbe_battary(self):
        print(f"This car has a {self.battery_size} -KWH battary.")
    def get_range(self):
        if self.battery_size == 70:
            print(f"This car can run almost 270KM.")
        elif self.battery_size == 85:
            print(f"This car can run almost 330KM.")

class ELectricCar(Car):
    --snip

my_tesla = ELectricCar('tesla', 'model s', 2020)
print(my_tesla.describe())
my_tesla.battery.descirbe_battary()
my_tesla.battery.get_range()
#####
2020 tesla model s
This car has a 70 -KWH battary.
This car can run almost 270KM.

④导入类
import sys
sys.path.append(“E:\A-桌面-Flies\Pycharm”)
from car_electriccar import Car, Battery, ELectricCar
文件名 导入

可以根据类所在文件名的不同定义不同的路径,都可以的。
后续的Python标准库,则引入了Python编好的类,以及类的编码风格,在书上看看就行了。我就不打字啦。(●ˇ∀ˇ●)

下面是我的运行实例。导入类不成功的话,可以看一下下哈哈O(∩_∩)O
在这里插入图片描述在这里插入图片描述

2021-09-17

参加华为官方手册:让Python给你一个对象 实验指导手册

1. 类的创建与使用

1.1 类的定义

创建 Employee类,根据 Employee类创建的每个实例都将存储名字和薪水。:

class Employee(object):
    "所有员工的基类"
    emCount = 0

    def __init__(self, name, salary):
        self.name = name
        self.salary = salary
        Employee.emCount += 1

    def dispalyEmployee(self):
        print(f'Name:{self.name}, Salary:{self.salary}')

    def lingqu(self):
        print(f'{self.name}领取了本月的工资{self.salary}')


emp1 = Employee("sanmu", 30000)
emp2 = Employee("su", 34000)
emp1.dispalyEmployee()
print(f'Total Employee {Employee.emCount}')
emp1.salary = 31000
emp1.lingqu()
Name:sanmu, Salary:30000
Total Employee 2
sanmu领取了本月的工资31000

1.2 继承

class Parent(object):
    parentAttr = 100
    def __init__(self):
        print("调用父类构造函数")
    def parentMethod(self):
        print("调用父类方法")
    def setAttr(self, attr):
        Parent.parentAttr = attr
    def getAttr(self):
        print("父类属性:", Parent.parentAttr)

class Child(Parent):
    def __init__(self):
        print("调用子类构造函数")
    def childMethod(self):
        print("调用子类方法")

c = Child() # 实例化子类
c.childMethod() # 调用子类的方法
c.parentMethod() # 调用父类方法
c.setAttr(200) # 再次调用父类的方法 - 设置属性值
c.getAttr() # 再次调用父类的方法 - 获取属性值

多继承:

创建父类 Dog,具备属性年龄和姓名;会吃饭和叫。
创建父类 Wolf,具备属性姓名、颜色;会捕猎。

多继承实现新的类 Husky:

class Dog(object):
    def __init__(self, age, name):  # dog_class 中的属性
        self.age = age
        self.name = name
    def bark(self):
        print(f'{self.name} is barking.')
    def eat(self, food):
        print(f'{self.name} is eating {food}')   # food 是特定功能eat中的属性
class Wolf(object):
    def __init__(self, name, color):
        self.name = name
        self.color = color
    def hunt(self, prey):
        print(f'{self.name} is hunting for {prey}')
class Husky(Dog, Wolf):
    def daze(self):
        print(f'{self.name} is in a daze.')

Husky1 = Husky(name="二哈", age= 1)
Husky1.eat("狗粮")
Husky1.hunt("小鸡仔")
Husky1.bark()
Husky1.daze()

私有化的属性

在私有属性前面

class Person(object):
    def __init__(self, name, age):
        self.name = name
        self.age = age
        self.__friend = ["李四", "王五"]
    def __play(self):
        print("打篮球")

class child(Person):
    pass

c = child("张三", 18)
print(c.friend)
c.__play

在这里插入图片描述

反射

通过字符串的形式来判断当前对象是否存在该属性或者方法。
hasattr(obj,name_str): 判断 object 是否有 name_str 这个方法或者属性。
getattr(obj,name_str): 获取 object 对象中与 name_str 同名的方法或者函数。
setattr(obj,name_str,value): 为 object 对象设置一个以 name_str 为名的 value 方法或者属性。
delattr(obj,name_str): 删除 object 对象中的 name_str 方法或者属性。

class Dog(object):
    def __init__(self, age, name):
        self.age = age
        self.name = name
    def eat(self, food):
        print("%s 吃 %s" % (self.name, food))
    def bark(self):
        print("呜..汪...汪汪..")

dog = Dog(3, "大黄")
dog.eat("qiaokeli")

if hasattr(dog, "eat"):
    eat = getattr(dog, "eat")
    food = input("你要喂它吃什么:")
    eat(food)
    setattr(dog, "temp", "饱")
    print("大黄吃%s 了" % dog.temp)

2. 类的属性(Attr)的操作

getattribute,设置属性被访问时的操作

class people(object):
    def __init__(self, name, age):
        self.name = name
        self.age = age
    def __getattribute__(self, item):
#  重写__getattribute__方法,形参 obj 是访问的属性,是一个属性名字字符串
        if item =="age":
            print("问别人的年龄是不礼貌的")
        else: #else 此处为其他属性访问过程,如果不写,那 age 和 show 方法就访问不到了
            temp = object.__getattribute__(self, item)
            return temp
    def show(self):
        print("---")

s = people("python",30)
print(s.age)
print(s.name)
s.show()

获取私有属性并赋值:

property 让方法向属性一样调用。

class Dog(object):
    def __init__(self, age, name):
        self.__age = age
        self.name = name
    @property  # 让方法向属性一样调用:
    def age(self):
        return self.__age
    @age.setter # 设置属性赋值要求
    def age(self, Age):
        if 0 < Age < 100:
            self.__age = Age
            return self.__age
        else:
            self.__age = 18
            return self.__age

dog = Dog(142451, 'BayMAX')
dog.age = 10
print(dog.age)

在类中设置只读属性:

class Dog(object):
    def __init__(self, age, name):
        self.__age = age
        self.name = name
    @property  # 让方法向属性一样调用:
    def age(self):
        return self.__age
    @age.getter
    def age(self):
        return self.__age

dog = Dog(142451, 'BayMAX')

print(dog.age)
dog.age = 10

在这里插入图片描述

3. 设计模式基础

class phone(object):
    def __init__(self, color, price):
        self.color = color
        self.price = price
    def get_price(self):
        return self.price

class DaMi(phone):
    def __init__(self, name):
        print(f'这是一台{name}')

class Li(phone):
    def __init__(self, name):
        print(f'这是一台{name}')

class Factory(object):
    def getphone(self, name, brand):
        if brand == 'DaMi':
            return DaMi(name)
        if brand == 'Li':
            return Li(name)

factory = Factory()
phone = factory.getphone("大米 11","DaMi")
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值