- 面向过程关注点:怎么做
- 面向对象关注点:谁来做
类名:采用大驼峰命名法
实例方法:定义在类的内部,类方法中第一个参数必须为self——默认传实例对象本身
- 定义在类里面,方法外面的属性:类属性
- 定义在方法里面使用self引用的属性:实例属性
init()
初始化方法,实例化对象的时候自动调用,完成一些初始化设置
- python自带的内置函数
- 用双下划线包起来[魔术函数]
class People:
def __init__(self,name,sex,age):
'''
实例属性的声明
'''
self.name = name
self.sex = sex
self.age = age
def eat(self,food):
print("{}喜欢吃{}".format(self.name,food))
xiaoming = People("小明","女",13)
print("姓名:{},性别:{},年龄:{}".format(xiaoming.name,xiaoming.sex,xiaoming.age))
xiaoming.eat("苹果")
魔法方法
是python中的一些内置好的特定方法,方法名为__xx__,在进行特定操作时被调用。
__init__方法:初始化一个类,在创建实例对象为其赋值时使用。
__str__方法:将对象转成字符串测试的时候使用。
__new__方法:创建并返回一个实例对象,调用了一次,就会得到一个对象。
__class__方法:获得已知对象的类。
__del__方法:对象在程序结束后对对象销毁时调用,来释放资源。
class Animal:
def __init__(self,name,color):
self.name = name
self.color = color
print("init函数执行啦")
def __str__(self):
'''
打印对象,自定义对象内容格式
:return:
'''
return ("我的名字是:%s,我的颜色是:%s"%(self.name,self.color))
def __new__(cls, *args, **kwargs):
'''
创建对象实例的方法,每调用一次,就会生成一个新的对象
经常在单例模式时使用
:param args:
:param kwargs:
'''
print("new函数执行啦")
return object.__new__(cls)
dog = Animal("旺财","白色")
print(dog)
析构方法
当一个对象被删除或者被销毁时,python解释器会默认调用__del__()方法,也称为析构方法
程序结束时,自动调用__del__方法
对象被删除时,也会自动调用__del__方法
- 封装
- 继承
- 多态
单继承
class Animal:
def eat(self):
print("吃")
pass
def drink(self):
print("喝")
pass
class Cat(Animal):
def jiao(self):
print("喵喵叫")
class Dog(Animal):
def jiao(self):
print("汪汪叫")
cat = Cat()
cat.eat()
多继承
class shenxian:
def fly(self):
print("神仙会飞")
class houzi:
def eat(self):
print("猴子喜欢吃桃")
class MonkeyKing(shenxian, houzi):
pass
monkey = MonkeyKing()
monkey.eat()
monkey.fly()
间接继承
class GrandFather:
def eat(self):
print("吃")
class Father(GrandFather):
pass
class Son(Father):
pass
son = Son()
son.eat()
print(Son.__mro__) #查找顺序
重写:子类有和父类相同的方法,子类中的方法会覆盖父类的方法
多态:同一种行为对于不同的子类,有不同的表现形式
class Animal:
def say_who(self):
print("我是一个动物...")
pass
pass
class Duck(Animal):
def say_who(self):
print("我是一个鸭子...")
pass
pass
class Dog(Animal):
def say_who(self):
print("我是一只小狗")
pass
pass
def commonInoke(obj):
obj.say_who()
pass
# duck = Duck()
# duck.say_who()
# dog = Dog()
# dog.say_who()
listObj = [Dog(), Duck()]
for item in listObj:
commonInoke(item)
class Student:
name = "李明"
def __init__(self, age):
self.age = age
lm = Student(18)
print(lm.name)
print(lm.age)
print(Student.name)
不可以通过实例对象对类属性进行修改
只能通过类对象对类属性进行修改
类方法:类对象所拥有的方法,需要用装饰器@classmethod修饰,类方法第一个参数是类对象cls,可以通过类对象或实例对象调用
class People:
country = "China"
#类方法
@classmethod
def get_country(cls):
return cls.country
#通过类方法可以修改类属性
@classmethod
def change_country(cls,data):
cls.country = data
pass
print(People.get_country())
people = People()
print(people.get_country())
people.change_country("英国")
print(People.get_country())
静态方法也是类对象所拥有的方法,用@staticmethod修饰,且不需要任何参数
一般情况下,不会通过实例对象访问静态方法。
在静态方法中,一般不会涉及类方法和属性的使用
import time
class Timer:
@staticmethod
def showTime():
return time.strftime("%H:%M:%S",time.localtime())
print(Timer.showTime())
私有属性:__开头,不能在类的外部被直接使用或访问
类的外部:包括由类实例化的对象,继承的类
子类不能继承父类的私有化属性
class Person:
__hobby = "跳舞"
def __init__(self):
self.__name = "李四"
self.__age = 30
pass
def __str__(self):
return '{}的年龄是{},爱好是{}'.format(self.__name, self.__age,Person.__hobby)
def setHobby(self,hobby):
Person.__hobby = hobby
class Student(Person):
pass
xl = Person()
print(xl)
student = Student()
student.setHobby("唱歌")
print(student)
私有化方法,在方法名前加__,在类的内部调用,子类不能继承,外部不能调用
- _xxx,前面加一个下划线,表示是protected类型的变量,只允许本身或子类访问,不能使用from import * 进行导入
- xx,前后两个下划线,魔法方法
- xxx_,后面单下划线,避免属性名与python关键字冲突
property
class Person(object):
def __init__(self):
self.__age = 18
# def get_age(self):
# return self.__age
#
# def set_age(self,age):
# if age < 0:
# print("年龄不能小于零")
# else:
# self.__age = age
#
# age = property(get_age,set_age)
# 通过装饰器的方式声明
@property #提供get方法
def age(self):
return self.__age
@age.setter
def age(self,age):
self.__age = age
p1 = Person()
print(p1.age)
p1.age = 25
print(p1.age)



