面相对象
声明类class,属性,方法,实例化对象
class student1:
name = 'ABC'
age = 20
def eat(self):
print("EAT!EAT!EAT!")
def run(self):
print("run FAST!")
S1 = student1()
S1.age = 25
S1.name = "QQ"
S1.eat()
S1.run()
print("{}的年龄是{}".format(S1.name,S1.age))
出现问题
SyntaxError: Non-UTF-8 code starting with '\xb5' in file e:\Code\Python\helloworld\Day2.py on line 118, but no encoding declared; see https://peps.python.org/pep-0263/ for details
这是这是没有定义python文件编码引起的问题
解决方法:在开头添加
# coding=gbk
实例方法
在类的内部,定义一个函数,且self为第一个参数
定义在类里面,方法外面的是属性,定义在方法里面的事实例属性
构造方法
init() (构造方法),类似于C++中的构造函数
init() 方法可以有参数,参数通过 init() 传递到类的实例化操作上
参数self类似于C++指向实例化对象的一个指针
init()是默认调用的
为实例化对象自动赋值
class Person():
def __init__(self, name, age, gender):
self.name = name
self.age = age
self.gender = gender
类的私有属性
两个下划线开头,声明该属性为私有,不能在类的外部被使用或直接访问。
# coding=gbk
from random import random
import math
import sys
class player:
def __init__(self, name, HP):
self.name = name
self.HP = HP
def __str__(self):
return "[%s]还剩下[%s]HP" % (self.name, self.HP)
def attack1(self, enemy):
enemy.HP -= 10
info = "[%s]捅了[%s]一刀" % (self.name, enemy.name)
print(info)
pass
def attack2(self, enemy):
enemy.HP -= 15
info = "[%s]砍了[%s]一刀" % (self.name, enemy.name)
print(info)
pass
def med(self):
self.HP += 10
info = "[%s]吃了一瓶药" % (self.name)
print(info)
pass
xm = player("西门吹雪", 100)
ye = player("叶孤城", 150)
print(xm.name,"HP=",xm.HP)
print(ye.name,"HP=",ye.HP)
while True:
if (xm.HP < 0) or (ye.HP < 0):
break
xm.attack1(ye)
print(xm)
print(ye)
ye.attack2(xm)
print(xm)
print(ye)
#xm.med()
析构方法
类似于C++中的析构函数 del(),解释器自动执行,释放空间
使用del关键字可以手动删除
单继承
子类会继承父类的属性和方法。
先定义自己的构造函数,再调用继承的构造函数
class 子类名(父类名):
class people:
name = ''
age = 0
__weight = 0
def __init__(self,n,a,w):
self.name = n
self.age = a
self.__weight = w
class stu(Person):
def __int__(self, name, age, gender, grade):
Person.__init__(self, name, age, gender) #调用父类的构造函数
stu.grade = grade
stuA1 = stu("WW", 30, "women", 100) #实例化一个stu类
多继承
class speaker:
def __init__(self, name, skill):
speaker.name = name
speaker.skill = skill
def speak(self):
print("开始演讲了")
class sample(stu, speaker):
def __init__(self, name, age, gender, grade, skill):
stu.__init__(self, name, age, gender, grade)
speaker.__init__(self, name, skill)
def show(self):
print("xingming = {}, age = {}, gender = {}, grade = {}, skill = {}"
.format(self.name, self.age, self.gender, self.grade, self.skill))
Sam1 = sample("SIMPLE", 35, "man", 9, 80)
Sam1.show()
重写父类方法
class fa1:
def MyPrint(self):
print("这是父类方法")
class Child1(fa1):
def MyPrint(self):
print("这是子类方法")
c1 = Child1()
c1.MyPrint()
调用父类方法
super(Child1,c1).MyPrint()
输出结果
这是子类方法
这是父类方法
类属性能被类对象和实例对象共同访问的
实例属性只能由实例对象访问
不能通过实例对线修改类属性
类方法
可以直接由类调用
#classmethod进行修饰
静态方法
Pycharm提示
方法 'speak' 可能为 'static'
表示函数不需要访问类属性,也不需要访问实例属性,可以定义为静态方法
@staticmethod修饰