【python】学习面向对象编程(二)

2020-10-14  本文已影响0人  虫虫工工队

注意点

上一节的补充点:

class Person:
  __slots__=['age']
  pass

p=Person()
p.age=1 #可以
p.num=2 #报错

方法相关的知识点

方法的概念和作用

方法的划分

class Person:
  def eat2(self):
    print('this is实例方法')

  @classmethod
  def leifangfa(cls):
    print('this is类方法')

  @staticmethod
  def jingtaifangfa():
    print('this is 静态方法')
#调用:
p=Person()
p.eat2()
Person.leifangfa()
Person.jingtaifangfa()

方法的存储

实例方法

class Person:
  def eat(self,food): 
  print('eating',food)

p=Peason()
p.eat('potato')

类方法

class Person:
  @classmethod
  def leifangfa(cls,a):
    print('这是一个类方法',cls,a)

Person.leifangfa(123)
#这是一个类方法 <class '__main__.Person> 123

p=Person()
p.leifangfa(666)
#这是一个类方法 <class '__main__.Person> 666
#这告诉我们:可以用实例调用类方法,但是实例会被忽略

func=Person.leifangfa
func(111)
#这是一个类方法 <class '__main__.Person> 111
#装饰器的作用:保证这个函数原本不改变的情况下,给这个函数增加一些功能

class A(Person):
  pass
A.leifangfa(0)
#这是一个类方法 <class '__main__.Person> 0

静态方法

class Person:
  @staticmethod
  def jingtai():
    print('这是一个静态方法')

Person.jingtai()
#这是一个静态方法
p=Person()
p.jingtai()
#这是一个静态方法
func=Person.jingtai
func()
#这是一个静态方法

补充内容

1、访问权限问题

2、类的补充内容

元类

用元类创建类对象

#type(类名,tuple,dict)
def run:
  print("run")
xxx=type("Dog",(),{"count":0,"run":run})
# 得到一个叫xxx的类
# 它有类属性count=0,类方法run
p=xxx()
p.run()
#run
print(p.count) #0

类的描述

类的描述的获取

类的属性分类

1.公有属性

class Animal:
  x=10
  def test(self):
    print(Animal.x)
    print(self.x)
  pass

class Dog(Animal):
  def test2(self):
    print(Dog.x)
    print(self.x)
  pass

#测试代码
a=Animal()
a.test()
#可以得到10,即在类的内部可以访问到这个公有属性
d=Dog()
d.test2()
#可以得到10,即在类的外部可以访问到这个公有属性

print(Animal.x)
print(Dog.x)
print(a.x)
print(d.x)
#这样也都可以访问到x
# file1.py
a=666
# file2.py
import file1
print(file1.a) #666
# file3.py
from file1 import *
print(a) #666

以上3段代码告诉我们:可以直接访问到a

2.受保护的属性

class Animal:
  _x=10
  def test(self):
    print(Animal._x)
    print(self._x)
  pass

class Dog(Animal):
  def test2(self):
    print(Dog._x)
    print(self._x)
  pass

#测试代码
a=Animal()
a.test()
#可以得到10,即在类的内部可以访问到这个受保护的属性

d=Dog()
d.test2()
#可以得到10,即在类的外部可以访问到这个受保护的属性

print(Animal._x)
print(Dog._x)
print(a._x)
print(d._x)
#这样也都可以访问到x,但是会有警报(黄色波浪线)
# file1.py
_a=666
# file2.py
import file1
print(file1._a) #666
#可以访问但是有警报
# file3.py
from file1 import *
print(_a) 
# 无法访问 直接报错
__all__=['_a']

3.私有属性

class Animal:
  __x=10
  def test(self):
    print(Animal.__x)
    print(self.__x)
  pass

class Dog(Animal):
  def test2(self):
    print(Dog.__x)
    print(self.__x)
  pass

#测试代码
a=Animal()
a.test()
#可以得到10,即在类的内部可以访问到这个私有属性

d=Dog()
d.test2()
#报错,不可以得到10,即在类的外部不可以访问到这个私有属性

print(Animal.__x)
print(Dog.__x)
print(a.__x)
print(d.__x)
#4条都会报错,在外部不可以访问私有属性
上一篇 下一篇

猜你喜欢

热点阅读