本文已参与「新人创作礼」活动,一起开启掘金创作之路。
🌞欢迎来到python的世界
🌈博客主页:卿云阁
💌欢迎关注🎉点赞👍收藏⭐️留言📝
🌟本文由卿云阁原创!
🌠本阶段属于筑基阶段之一,希望各位仙友顺利完成突破
📆首发时间:🌹2021年12月11日🌹
✉️希望可以和大家一起完成进阶之路!
🙏作者水平很有限,如果发现错误,请留言轰炸哦!万分感谢!
0️⃣✨✨✨编程的两大重要思想✨✨✨
面向过程和面向对象
突然想吃番茄炒蛋
面向过程的做法: 1.去买番茄和鸡蛋 2.洗番茄,打鸡蛋 3.放油,煎鸡蛋,把煎好的鸡蛋放到盘子 里。4.开始炒番茄 5.放在一起炒
面向对象的做法: 点外卖。
1️⃣✨✨✨类和对象✨✨✨
Python中一切对象。
类属性和实例对象属性
class Person2 :
count=0
name="Person" #类属性(直接写在类里的变量)
def __init__(self, name, age): #初始化方法
self.name1 = name
self.age1 = age # self.age实例对象属性
def say_hi(self): #实例方法
print("你好,我叫",self.name1)
p1 = Person2('卿云',18) #对象的创建
p1.say_hi()
#结果:
#runfile('C:/Users/张钊/.spyder-py3/temp.py', wdir='C:/Users/张钊/.spyder-py3')
#你好,我叫 卿云
补充:
**(1)**self
翻译:自;自我;自己。
我建议在形参列表中加上self,它本身要接受的是实例对象可以用其他的参数名,但是为了便于阅读和理解一般选择self。
p1 = Person2('卿云',18)
p1-------------------------->self
注意:类中的方法第一个参数是 self 的才可以被实例调用。
类中带 self 的参数都是实例的,实例对这个参数拥有所有权,即实例中所有的方法都可以使用实例的参数。
(2) 类和对象的创建
class Person2 : #类的创建
p1 = Person2('卿云',18) #对象的创建
1.__new__------------------>创建对象通俗点说有个内存空间(一般不用写)
2.__init__-------------------->刚申请的空间进行初始化
类对象的创建
类属性:(实例对象共有的)
count=0
name="Person"
类方法:
def __init__(self, name, age):
def say_hi(self):
......
实例对象的创建
name1="卿云“
age1=18(age1指向18)
默认属性:
--class--
指向类对象。
--dict--
当前对象的所有属性
3.类属性和实例对象属性
class Person2 :
count=0
name="Person" #类属性(直接写在类里的变量)
p1=Person2()
p2=Person2()
print((p1.name,p2.name)) #(p1.name,p2.name)是一个元组
Person2.name="卿云"
print((p1.name,p2.name))
p1.name="卿云"
p2.name="卿云阁"
print((p1.name,p2.name))
#('Person', 'Person')
#('卿云', '卿云')
#('卿云', '卿云阁')
默认情况下类属性是直接被开放出去的,可以被改变的。由于我们不希望类的属性在类外被改因为这样会使类的封装性变差,所以我们要有私有属性。
2️⃣✨✨✨私有属性和公有属性✨✨✨
class A:
__name='卿云'
def get_name():
print(A.__name)
A.get_name()
#A. __name 类外不允许直接访问私有属性
#结果
#卿云
私有属性:通常约定以2个下划线开头但是不以2个下划线结束的属性是私有的其他为公有的。不可以在类外直接访问私有属性但是可以在方法中访问。
3️⃣✨✨✨类方法、实例方法,静态方法✨✨✨
**类方法、@classmethod 传递的是类对象的引用。**类方法可以被实例调用,也可以被类调用。
类方法由类调用,采用@classmethod装饰,至少传入一个cls(代指类本身,类似self)参数。执行类方法时, 自动将调用该方法的类赋值给cls。建议只使用类名.类方法的调用方式。(虽然也可以使用实例名.类方法的方式 调用)
class Person:
@classmethod #装饰器的作用:在保证原函数不变的情况下,直接给这个函数增加一些功能
def leifangfa(cls,a):
print("这是一个类方法" , a)
Person.leifangfa(123)
p = Person()
p.leifangfa(666)
func = Person.leifangfa
func(111)
实例方法, 传递的是实例对象的引用。
class Person:
def eat(self,food):#self可以是aa、bb 等,一般是self
print('在吃饭',food)
p = Person()
p.eat('土豆')
**静态方法,@staticmethod 不传递对象的引用(**既可以通过类调用,也可以通过示例调用)
class Person:
@staticmethod #装饰器的作用:在保证原函数不变的情况下,直接给这个函数增加一些功能
def jingtai():
print("这是一个静态方法")
p = Person()
p.jingtai()
func = Person.jingtai
func()
4️⃣✨✨✨私有方法和公有方法✨✨✨
不能直接访问私有方法,但可以在其它方法中访问
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def __check_name(self): #判断name是否为空
if self.name=='':return False
else: return True
def get_name(self):
if self.__check_name():print(self.name, self.age)
else: print("NO Value")
p = Person('卿云',18)
p.get_name()
#p.__check_name是非法的
5️⃣✨✨✨继承✨✨✨
派生类
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def say_hi(self):
print("你好,我叫{0},{1}岁".format(self.name,self.age))
class Student:
def __init__(self, name, age,id):
self.name = name
self.age = age
self.id = id
def say_hi(self):
Person.say_hi(self)
print("id is",self.id )
p1 = Person('卿云',18)
p1.say_hi()
s1= Student('zhangxveqing',18,'2020180')
s1.say_hi()
结果:
你好,我叫卿云,18岁
你好,我叫zhangxveqing,18岁
id is 2020180
类成员的继承与重写
class D:
def __init__(self, x, y):
self.x = x
self.y = y
def area(self):
pass
class C(D):
def __init__(self, r):
D.__init__(self, r, 0)
def area(self):
return 3.14* self.x* self.x
class R(D):
def __init__(self, w,h):
D.__init__(self, w,h)
def area(self):
return self.x* self.y
d1=C(2.0)
d2=R(2.0,4.0)
print(d1.area(),d2.area())
#结果:
#12.56 8.0